Что из импортируемого сопутствующего объекта или расширяющего признака лучше

#scala #spray-json #companion-object

#scala #spray-json #сопутствующий объект

Вопрос:

У меня есть протокол JSON, написанный на spray

 trait MyJsonProtocol {
   //some logic
}

object MyJsonProtocol extends MyJsonProtocol {

}
  

Теперь, что лучше?? Импорт этого сопутствующего объекта или расширение признака?

Комментарии:

1. Оба в порядке.

2. Это не вопрос, основанный на мнении, речь идет о конкретном варианте использования, где существуют четкие технические различия между двумя решениями.

Ответ №1:

Если вы создаете несколько JsonFormat экземпляров для spray, то вы можете просто object напрямую создать и import это. Это означает, что у вас есть только один экземпляр ваших неявных val и объектов.

 object MyJsonProtocol extends DefaultJsonProtocol {
  implicit object MyTypeJsonFormat extends RootJsonFormat[MyType] {
    def write(v: MyType): JsValue = ...
    def read(value: JsValue): MyType = ...
  }

  implicit val myClassFormat = jsonFormat5(MyClass)
}

class OtherClass {
  import MyJsonProtocol._

  ...
}
  

Ответ №2:

Это зависит от сценария, потому что сопутствующий класс или объект может получить доступ к закрытым членам своего сопутствующего класса. Используйте сопутствующий объект для методов и значений, которые не являются специфичными для экземпляров сопутствующего класса. Если вы просто хотите множественное наследование, но допускаете повторное использование кода, тогда trait подойдет.

Надеюсь, это поможет.

Ответ №3:

Это зависит от вашей логики. Если вы определяете некоторые импликации, импорт объекта и расширение признака отличаются. При импорте вы определяете импликации с тем же приоритетом, что и локальные. При расширении вы создаете импликации с низким приоритетом по сравнению с локальными.

Комментарии:

1. Это имело бы значение только в том случае, если протокол имеет конфликтующую реализацию JsonFormat , что кажется очень маловероятным.

2. Логика может быть не такой примитивной. Может быть несколько индуктивно определенных экземпляров.