繁体   English   中英

案例类私有构造函数-需要readResolve实现

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM