Как вы можете видеть на примере Дейва Гриффита, первичный конструктор должен быть «самым общим» в том смысле, что любой другой конструктор должен вызывать его (прямо или косвенно). Как вы можете себе представить, это иногда приводит к уродливым первичным конструкторам. Обычная стратегия - использовать объект-компаньон, чтобы скрыть безобразие (и вам не нужно вводить «новый»):
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")
Конечно, вы должны быть осторожны, если хотите наследовать от своего класса (например, это невозможно в примере выше)