Definition. The sealed is a Scala keyword used to control the places where given trait or class can be extended. More concretely, the subclasses and the implementations can be defined only in the same source file as the sealed trait or class.
In Scala, Final is a keyword and used to impose restriction on super class or parent class through various ways. We can use final keyword along with variables, methods and classes.
final : Cannot be extended further. sealed : Can only be extended by its permitted subclasses. non-sealed : Can be extended by unknown subclasses; a sealed class cannot prevent its permitted subclasses from doing this.
Private Class members are only accessible within a declared class. Sealed class members are accessible outside the class through object.
A final
class cannot be extended, period.
A sealed
trait can only be extended in the same source file as it's declared. This is useful for creating ADTs (algebraic data types). An ADT is defined by the sum of its derived types.
E.g.:
Option[A]
is defined by Some[A]
+ None
.List[A]
is defined by ::
+ Nil
.sealed trait Option[+A]
final case class Some[+A] extends Option[A]
object None extends Option[Nothing]
Because Option[A]
is sealed, it cannot be extended by other developers - doing so would alter its meaning.
Some[A]
is final because it cannot be extended, period.
As an added bonus, if a trait is sealed, the compiler can warn you if your pattern matches are not exhaustive enough because it knows that Option
is limited to Some
and None
.
opt match {
case Some(a) => "hello"
}
Warning: match may not be exhaustive. It would fail on the following input:
None
sealed
classes (or traits) can still be inherited in the same source file (where final
classes can't be inherited at all).
Use sealed
when you want to restrict the number of subclasses of a base class (see "Algebraic Data Type").
As one of the very practical benefits of such a restriction the compiler can now warn you about non-exaustive pattern matches:
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
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With