Мы можем определить сопутствующий объект Scala для абстрактного класса:
object CompanionAbstractClass {
def newInstance():CompanionAbstractClass = CACChild("companion abstract class")
}
//sealed trait TestQ{
sealed abstract class CompanionAbstractClass{
val name:String
}
case class CACChild(name:String) extends CompanionAbstractClass
Из кода Scala я могу использовать его как:
val q1 = CompanionAbstractClass.newInstance.name
Из кода Java его можно использовать как:
CompanionAbstractClass.newInstance().name();
Для лучшей композиции в Scala мы предпочитаем использовать черты:
object CompanionTrait {
def newInstance():CompanionTrait = CTChild("companion trait")
}
sealed trait CompanionTrait {
val name:String
}
case class CTChild(name:String) extends CompanionTrait
Из Scala его можно использовать аналогично ранее:
CompanionTrait.newInstance().name
Но теперь из Java я не могу вызвать его так же, как:
CompanionTrait.newInstance().name();
Я могу сделать это только через:
CompanionTrait$.MODULE$.newInstance().name();
Чтобы улучшить предыдущий синтаксис и избавиться от этого "$", я могу создать оболочку в Scala или Java (что не очень хорошо для моего варианта):
object CompanionTraitFactory {
def newInstance():CompanionTrait = CompanionTrait.newInstance()
}
Теперь из Java я могу использовать его также как:
CompanionTraitFactory.newInstance().name();
Не могли бы вы объяснить, почему в случае, если для признака определен объект-компаньон, я не могу использовать его из Java способами, как его можно использовать, если он определен либо для абстрактного класса (CompanionAbstractClass
case), или даже как обычный синглтон (CompanionTraitFactory
чехол). Ребята, я более или менее понимаю разницу между чертами скалы и абстрактными классами. Я хочу понять, , почему он был реализован таким образом и , есть ли вероятность, что он будет поддерживаться в Scala в будущем .