2016-04-13 19 views
0

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 .

+0

[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

Antwort

0

Hier ist an explanation of some benefits:

Eine letzte Fall-Klasse kann nicht durch eine andere Klasse erweitert werden. Dies bedeutet, dass Sie stärkere Garantien dafür geben können, wie sich Ihr Code verhält. Sie wissen, dass niemand Ihre Klasse unterklassifizieren, einige Methoden außer Kraft setzen und etwas Goofy passieren lassen kann. Das ist großartig, wenn Sie Code debuggen - Sie müssen nicht in der gesamten Objekthierarchie nachschauen, um herauszufinden, welche Methoden tatsächlich aufgerufen werden.

Natürlich macht das Beenden von Klassen eine Form der Erweiterbarkeit. Wenn Sie Benutzern die Möglichkeit geben möchten, Funktionalität zu implementieren, sollten Sie diese Funktionalität in ein Merkmal einfügen und stattdessen das Typklassenmuster verwenden.

+0

Danke @marcospereira. Es scheint also, dass es nur die Vererbung stoppt. Für uns ist das kein großer Gewinn, weil wir ohnehin nicht versuchen, Fallklassen zu erweitern. Ich hoffe, es gibt noch mehr Vorteile. – rmin