Comme vous pouvez le voir dans l'exemple de Dave Griffith, le constructeur principal doit être le « plus général » un dans le sens que tout autre constructeur doit appeler (directement et indirectement). Comme vous pouvez l'imaginer, cela conduit parfois à des constructeurs primaires laids. Une stratégie commune est d'utiliser l'objet compagnon pour cacher la laideur (et vous n'avez pas besoin de taper la « nouvelle »):
class Foo private (arg:Either[String, Int]){
...
}
object Foo {
def apply(arg:String) = new Foo(Left(arg))
def apply(arg:Int) = new Foo(Right(arg))
}
val a = Foo(42)
val b = Foo("answer")
Bien sûr, vous devez être prudent si vous voulez hériter de votre classe (par exemple, ce n'est pas possible dans l'exemple ci-dessus)
Vous parlez de constructeurs, pas d'initialiseurs de classe. Veuillez changer le libellé de votre question Les initiateurs de classe sont exécutés lorsque la classe est chargée, tandis que les constructeurs sont appelés lorsque des instances de la classe sont créées. –
duplication possible de [Scala constructor overload?] (Http://stackoverflow.com/questions/1095329/scala-constructor-overload) –