Kotlin zapečaćeni tečajevi

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 elsegrane za zadani uvjet u izrazu when.

Sada, ako iz Exprrazreda izvodite novi podrazred , kompajler neće otkriti ništa jer ga elsegrana 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 whenizrazu, nije potrebno koristiti elsegranu.

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 elsepodružnice. Ako iz Exprrazreda izvodite novu podklasu , sastavljač će se žaliti ukoliko se podrazred ne obrađuje u whenizrazu.

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 privateprema 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.

Zanimljivi članci...