case class 私有构造函数 - 需要 readResolve 实现

case class private constructor - need for readResolve implementation

我只是在谷歌上搜索以了解如何使用私有构造函数创建案例 class。以下是

中描述的正确方法

How to override apply in a case class companion

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 class 抽象,那么编译器将不会生成复制和应用方法的实现。

下面是我正在努力解决的问题:-

为什么需要提供 readResolve 的实现?

readResolve 实现用于通过编辑 class.

的序列化副本来防止创建案例 class 的无效实例

根据您对使用代码的环境的信任程度,您可能会觉得可以安全地忽略此风险。

它的出现是因为案例 class 扩展了 Serializable,因此最终可能会被序列化并写入文件(或数据库,或任何地方)。此时可以编辑 file/DB/wherever 中的序列化副本以创建无效值(例如,使 s 小写)。在反序列化返回时,'live' 实例将无效,除非反序列化过程中使用的 readResolve 方法被覆盖以防止这种情况发生。