Ci sono due tipi di modificatori a Scala: final
e sealed
Quali sono le differenze tra la classe finale e la classe sigillata in Scala?
Quali sono le differenze tra di loro? Quando dovresti usarne uno sull'altro?
Ci sono due tipi di modificatori a Scala: final
e sealed
Quali sono le differenze tra la classe finale e la classe sigillata in Scala?
Quali sono le differenze tra di loro? Quando dovresti usarne uno sull'altro?
Una classe final
non può essere estesa, punto.
Un tratto di sealed
può essere esteso nello stesso file sorgente come dichiarato. Questo è utile per creare ADT (tipi di dati algebrici). Un ADT è definito dalla somma dei tipi derivati.
Es .:
Option[A]
è definita da Some[A]
+ None
.List[A]
è definito da ::
+ Nil
.sealed trait Option[+A]
final case class Some[+A] extends Option[A]
object None extends Option[Nothing]
Perché Option[A]
è sigillato, non può essere prorogato di altri sviluppatori - così facendo avrebbe alterato la sua significa.
Some[A]
è finale perché non può essere esteso, punto.
Come bonus aggiuntivo, se un tratto è sigillato, il compilatore indica se le corrispondenze di pattern non sono abbastanza esaustivo perché sa che Option
è limitata-Some
e None
.
opt match {
case Some(a) => "hello"
}
Attenzione: partita non può essere esaustivo. Fallirebbe sul seguente ingresso:
None
sealed
classi (o tratti) può ancora essere ereditata nello stesso file sorgente (dove final
classi non possono essere ereditate a tutti).
Utilizzare sealed
quando si desidera limitare il numero di sottoclassi di una classe base (vedere "Tipo di dati algebrico").
Come uno dei vantaggi molto pratici di tale restrizione il compilatore può ora mettere in guardia su modello non esaustivo partite:
sealed trait Duo
case class One(i:Int) extends Duo
case class Two(i:Int, j:Int) extends Duo
def test(d:Duo) {
match {
case One(x) => println(x) // warning since you are not matching Two
}
}
Tecnicamente i modelli 'sealed' possono essere estesi nella stessa * unità di compilazione *, non lo stesso file. Il fatto che l'unità di compilazione del compilatore Scala sia uguale a un file è un dettaglio di implementazione. Potrebbero esserci altri compilatori che utilizzano, ad esempio, un database per memorizzare risorse utente di origine anziché il filesystem. –
Tecnicamente parlando 'templates sealed' possono essere estesi nella stessa unità di compilazione * * , non lo stesso file. Il fatto che l'unità di compilazione del compilatore Scala sia uguale a un file è un dettaglio di implementazione. Potrebbero esserci altri compilatori che utilizzano, ad esempio, un database per memorizzare risorse utente di origine anziché il filesystem. –
@ JörgWMittag Grazie per l'addendum, non ero a conoscenza di questa distinzione. – dcastro