Einige Open-Source-Bibliotheken like twitters scheinen eine Konvention für die Kennzeichnung von Fallklassen wie final
zu haben.Was sind die praktischen Vorteile der Markierung von Fallklassen als Endgültige in der Skala
Mein Team entscheidet, ob diese Konvention übernommen werden soll, aber wir verstehen noch nicht die Vorteile, dies zu tun. Momentan ist der einzige mögliche Vorteil, den ich wahrnehmen kann, dass er zufällige Vererbung von Fallklassen verhindert.
Aber gibt es noch andere Vorteile? Verbessert es die Kompilierzeit oder ermöglicht es dem Compiler, interne Optimierungen hinzuzufügen?
Ich hatte gehofft, dass es helfen würde, fehlende Werte in Musterübereinstimmungen zu finden, aber es scheint auch nicht so zu sein. In einem einfachen Skript wie folgt, erzeugt der Compiler eine Warnung für matchSealed
aber nicht für matchFinal
:
sealed case class Sealed(one: Option[Int], two: Option[Int])
def matchSealed(s: Sealed): Unit = s match {
case Sealed(Some(i), None) => println(i)
}
final case class Final(one: Option[Int], two: Option[Int])
def matchFinal(f: Final): Unit = f match {
case Final(Some(i), None) => println(i)
}
Mein Eindruck von final
ist, dass es eine stärkere Einschränkung als sealed
, so ist es seltsam, dass dies erzeugt keine Warnung .
[Dieser Artikel] (http://underscore.io/blog/posts/2015/06/02/everything-about-sealed.html) spricht in seinen abschließenden Kommentaren über dieses Thema. Der Autor verwendet "final" und sagt, dass es beschreibender ist, es ist eine Konvention und es eröffnet Möglichkeiten für Compiler-Optimierungen (obwohl keine bekannt sind). – rmin