Sobes.tech
Middle

Koja je razlika između sealed-klasa i apstraktnih klasa u Kotlinu?

sobes.tech АИ

Одговор од АИ

Glavna razlika između sealed klasa i apstraktnih klasa je u tome što sealed klase ograničavaju hijerarhiju nasleđivanja na nivo jednog fajla ili modula (za Kotlin 1.5+). Naslednici sealed klase moraju biti deklarisani u istom fajlu kao i sama sealed klasa, što obezbeđuje potpunu kontrolu pri korišćenju izraza when.

Razlike:

  • Nasleđivanje:
    • Apstraktne klase mogu biti nasledjene bilo gde u projektu.
    • Sealed klase mogu biti nasledjene samo unutar istog fajla (do Kotlin 1.5) ili u okviru istog modula (sa Kotlin 1.5+).
  • Korišćenje sa when:
    • Pri korišćenju when sa sealed tipom, kompilator može da proveri da li su svi mogući podtipovi uzeti u obzir, što čini when potpunim i uklanja potrebu za eksplicitnim navodom else grane, ako su svi podtipovi obrađeni.
    • Sa apstraktnim klasama, kompilator ne može garantovati potpunost, pa je često potrebna else grana.
  • Kreiranje instanci:
    • Ni apstraktne, ni sealed klase ne mogu biti direktno instancirane.
  • Članovi:
    • Kao i apstraktne, tako i sealed klase mogu imati apstraktne i neapstraktne članove.

Primer sealed klase:

sealed class Result<out T> {
    data class Success<out T>(val data: T) : Result<T>()
    data class Error(val message: String) : Result<Nothing>()
}

fun processResult(result: Result<Int>) {
    when (result) {
        is Result.Success -> {
            // Obrada uspešnog rezultata
            println("Success: ${result.data}")
        }
        is Result.Error -> {
            // Obrada greške
            println("Error: ${result.message}")
        }
        // Nije potrebna else, ako su svi naslednici obrađeni
    }
}

Primer apstraktne klase:

abstract class Shape {
    abstract fun area(): Double
}

class Circle(val radius: Double) : Shape() {
    override fun area(): Double = Math.PI * radius * radius
}

class Rectangle(val width: Double, val height: Double) : Shape() {
    override fun area(): Double = width * height
}

fun calculateArea(shape: Shape): Double {
    return shape.area()
}

Kada koristiti:

  • Sealed klase: Idealne za predstavljanje ograničenog skupa mogućih stanja ili tipova, kada vam je potrebna potpunost u when izrazima. Često se koriste za modeliranje rezultata operacija (uspeh/greska), stanja UI, događaja.
  • Apstraktne klase: Pogodne za definisanje opšte funkcionalnosti i ugovora za grupu povezanih klasa, koje mogu biti nasledjene bilo gde u projektu.

Ukratko, sealed klase pružaju strožu kontrolu nad hijerarhijom nasleđivanja i poboljšavaju sigurnost i čitljivost koda pri obradi ograničenog skupa podtipova.