导入伴随对象和扩展特征哪个更好

Which among importing companion object or extending trait is better

我有一个用 spray 编写的 JSON 协议

trait MyJsonProtocol {
   //some logic
}

object MyJsonProtocol extends MyJsonProtocol {

}

现在哪个更好??导入此伴生对象或扩展特征 ?

这取决于场景,因为一个companion class 或object 可以访问其companion 的private 成员。将伴随对象用于不特定于伴随实例的方法和值 class。如果您只想多重继承但允许代码可重用性,那么 trait 就可以了。

希望对您有所帮助。

如果您正在为喷雾创建一些 JsonFormat 实例,那么您可以直接创建一个 object 然后 import 那个。这意味着您只有一个隐式值和对象实例。

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._

  ...
}

这取决于你的逻辑。如果你定义了一些隐式,那么导入一个对象和扩展一个特征是不同的。如果导入,则定义与本地相同优先级的隐式。如果你扩展,你会创建与本地隐式相比低优先级的隐式。