#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. Логика может быть не такой примитивной. Может быть несколько индуктивно определенных экземпляров.