U ovom ćete članku naučiti o zapečaćenom razredu, kako su stvoreni i kada ih koristiti uz pomoć primjera.
Zapečaćene klase koriste se kada vrijednost može imati samo jedan od tipova iz ograničenog skupa (ograničene hijerarhije).
Prije nego što krenemo u detalje o zapečaćenim časovima, istražimo koji problem oni rješavaju. Uzmimo primjer (preuzeto sa službenog web mjesta Kotlin - članak zapečaćene klase):
class Expr class Const(val value: Int) : Expr class Sum(val left: Expr, val right: Expr) : Expr fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) else -> throw IllegalArgumentException("Unknown expression") )
U gornjem programu osnovna klasa Expr ima dvije izvedene klase Const (predstavlja broj) i Sum (predstavlja zbroj dva izraza). Ovdje je obavezna upotreba else
grane za zadani uvjet u izrazu when.
Sada, ako iz Expr
razreda izvodite novi podrazred , kompajler neće otkriti ništa jer ga else
grana obrađuje što može dovesti do bugova. Bilo bi bolje da je prevodilac izdao pogrešku kad smo dodali novu podrazred.
Da biste riješili ovaj problem, možete koristiti zapečaćenu klasu. Kao što je spomenuto, zatvorena klasa ograničava mogućnost stvaranja potklasa. I, kada obrađujete sve podrazrede zapečaćene klase u when
izrazu, nije potrebno koristiti else
granu.
Za stvaranje zapečaćene klase koristi se zapečaćeni modifikator. Na primjer,
zapečaćena klasa ekspr
Primjer: Zapečaćena klasa
Evo kako možete riješiti gornji problem pomoću zapečaćene klase:
sealed class Expr class Const(val value: Int) : Expr() class Sum(val left: Expr, val right: Expr) : Expr() object NotANumber : Expr() fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) NotANumber -> java.lang.Double.NaN )
Kao što vidite, nema else
podružnice. Ako iz Expr
razreda izvodite novu podklasu , sastavljač će se žaliti ukoliko se podrazred ne obrađuje u when
izrazu.
Nekoliko važnih napomena
- Sve podklase zapečaćene klase moraju biti deklarirane u istoj datoteci u kojoj je deklarirana zapečaćena klasa.
- Zapečaćena klasa je sama po sebi apstraktna i iz nje ne možete instancirati objekte.
- Ne možete stvoriti ne privatne konstruktore zapečaćene klase; njihovi su konstruktori
private
prema zadanim postavkama.
Razlika između enuma i zapečaćene klase
Klasa Enum i zapečaćena klasa prilično su slične. Skup vrijednosti za tip nabrajanja također je ograničen poput zapečaćene klase.
Jedina je razlika u tome što enum može imati samo jedan primjerak, dok potklasa zapečaćene klase može imati više primjeraka.