Warum würden Sie einen einzelnen Wert in eine zusätzliche Klasse einfügen?
Ein großer Anwendungsfall ist die Typensicherheit. Angenommen, Sie Funktion haben, das Geld vermehren kann, etwa so:
def multiply(factor: Int, amount: Int): Int = ???
Das Problem dabei ist, dass es sehr einfach sein würde, die zwei Argumente zu verwirren und damit die Funktion falsch nennen. Mit Werten Klassen, könnten Sie eine Money
Art erstellen und neu schreiben, die Funktion wie folgt:
case class Money(amount: Int) extends AnyVal
def multiply(factor: Int, amount: Money): Money = ???
Jetzt mit Ihrem speziellen Money
Typ, wird der Compiler Ihnen sagen, wenn Sie versuchen, Argumente in der falschen Reihenfolge zu übergeben.
Wenn es sich nicht um eine Wertklasse handelt, kann man sagen, dass die hinzugefügte Sicherheit in manchen Fällen die Leistung nicht wert ist. Bei Wertklassen haben Sie jedoch keinen Laufzeitaufwand (Einschränkungen gibt es jedoch: http://docs.scala-lang.org/overviews/core/value-classes.html).
Eine Alternative das gleiche Ziel sind unboxed (keine Laufzeit-Overhead) markierte Typen in scalaz zu erreichen: http://eed3si9n.com/learning-scalaz/Tagged+type.html
Beachten Sie, dass zum Beispiel Haskell verwendet newtype
für die gleiche Idee: https://wiki.haskell.org/Newtype
* Aufruf this.i + Das scheint mir nicht viel langsamer als ich. * Wie haben Sie das festgestellt? Haben Sie diesen Code mikrobenchmarkiert? –
Abgesehen von der Tatsache, dass der Aufruf schneller ist (was höchstwahrscheinlich immer vom JIT-Compiler inline ausgeführt wird), vermeiden Wertklassen die Objektinstanziierung, wodurch die Garbage Collection-Last reduziert wird. – Suma