导入伴随对象和扩展特征哪个更好
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._
...
}
这取决于你的逻辑。如果你定义了一些隐式,那么导入一个对象和扩展一个特征是不同的。如果导入,则定义与本地相同优先级的隐式。如果你扩展,你会创建与本地隐式相比低优先级的隐式。
我有一个用 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._
...
}
这取决于你的逻辑。如果你定义了一些隐式,那么导入一个对象和扩展一个特征是不同的。如果导入,则定义与本地相同优先级的隐式。如果你扩展,你会创建与本地隐式相比低优先级的隐式。