Dis que j'écris une méthode d'extension
implicit class EnhancedFoo(foo: Foo) {
def bar() { /* ... */ }
}
Devez-vous toujours inclure extends AnyVal
dans la définition de classe? Dans quelles circonstances ne voudriez-vous pas transformer une classe implicite en une classe de valeur?
Regardons les limitations listées pour les classes de valeur et pensons quand elles pourraient ne pas convenir aux classes implicites:
"ne doit avoir qu’un constructeur primaire avec exactement un paramètre public, val dont le type n’est pas une classe de valeur." Donc, si la classe que vous enveloppez est elle-même une classe de valeur, vous ne pouvez pas utiliser un implicit class
comme wrapper, mais vous pouvez le faire:
// wrapped class
class Meters(val value: Int) extends AnyVal { ... }
// wrapper
class RichMeters(val value: Int) extends AnyVal { ... }
object RichMeters {
implicit def wrap(m: Meter) = new RichMeter(m.value)
}
Si votre wrapper a également des paramètres implicites, vous pouvez essayer de les déplacer vers les déclarations de méthode. C'est à dire. au lieu de
implicit class RichFoo[T](foo: Foo[T])(implicit ord: Ordering[T]) {
def bar(otherFoo: Foo[T]) = // something using ord
}
tu as
implicit class RichFoo[T](foo: Foo[T]) extends AnyVal {
def bar(otherFoo: Foo[T])(implicit ord: Ordering[T]) = // something using ord
}
"ne peut pas avoir de paramètres de type spécialisés." Vous souhaiterez peut-être que l'encapsuleur soit spécialisé lors de l'encapsulation d'une classe qui possède elle-même des paramètres de type spécialisés.
equals
ou hashCode
." Non pertinent, car les classes implicites ne devraient pas non plus avoir equals/hashCode
.var
s ou lazy val
s.De plus, transformer votre classe implicite en classe de valeur pourrait éventuellement modifier certains comportements du code en utilisant la réflexion, mais cette dernière ne devrait normalement pas voir les classes implicites.
Si votre classe implicite satisfait toutes ces limitations, je ne vois aucune raison de ne pas en faire une classe de valeur.
Je sens que vous confondez Classes de valeur avec Classes implicites . Il est rare que vous étendiez quoi que ce soit lorsque vous définissez une classe implicite pour une amélioration alors que Value Classes must extend AnyVal
.