[英]case class private constructor - need for readResolve implementation
我只是在搜寻以发现如何使用私有构造函数创建案例类。 以下是执行此操作的正确方法,如
object A {
def apply(s: String, i: Int): A =
new A(s.toUpperCase, i) {} //abstract class implementation intentionally empty
}
abstract case class A private[A] (s: String, i: Int) {
private def readResolve(): Object = //to ensure validation and possible singleton-ness, must override readResolve to use explicit companion object apply method
A.apply(s, i)
def copy(s: String = s, i: Int = i): A =
A.apply(s, i)
}
以下是我到目前为止的理解:
如果我们声明一个case类抽象,那么编译器将不会生成copy和apply方法的实现。
以下是我正在努力解决的问题:
为什么需要提供readResolve的实现?
那里的readResolve实现可以通过编辑类的序列化副本来防止创建case类的无效实例。
根据您对使用代码的环境的信任程度,您可能会感到可以放心地忽略此风险。
之所以会这样,是因为案例类扩展了Serializable
,因此最终可能会被序列化并写到文件(或DB,或任何地方)中。 此时在文件中的序列化副本/ DB /哪里可以进行编辑,以创建一个无效的值(例如,使得s
小写)。 反序列化时,“活动”实例将无效,除非覆盖了反序列化过程中使用的readResolve
方法以防止这种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.