Почему не используются встроенные фабричные методы для классов значений?
Рассматривать:
class Wrap(val amount :Int) extends AnyVal
object Wrap {
@inline final def apply(int :Int) = new Wrap(int)
}
object Playground {
val w = Wrap(1)
}
составление с (2.11.7) scalac -feature -Xprint:all Playground.scala
я вижу
Playground.this.w = Wrap.apply(1);
и действительно, javap -v -private Playground
показывает:
89: invokevirtual #75 // Method Wrap$.apply:(I)I
92: putfield #33 // Field w:I
При изменении конструктора детской площадки на:
val w = new Wrap(1)
оба показывают назначение буквального 1
в w
как и ожидалось. Откровенно говоря, я весьма разочарован этим открытием, так как оно практически предотвращает программирование на уровне типов с использованием классов значений (где экземпляр класса эфемерных значений создается цепочкой тривиальных встроенных методов).