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
方法被覆盖以防止这种情况发生。
我只是在谷歌上搜索以了解如何使用私有构造函数创建案例 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
方法被覆盖以防止这种情况发生。