我只是在谷歌上搜索如何使用私有构造函数创建案例类。以下是执行此操作的正确方法,如中所述
如何在案例类同伴中覆盖 apply
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 实现是为了防止通过编辑类的序列化副本来创建案例类的无效实例。
根据您对使用代码的环境的信任程度,您可能会觉得可以安全地忽略此风险。
它的出现是因为案例类扩展了Serializable
,因此最终可能会被序列化并写入文件(或数据库,或任何地方)。此时,可以编辑文件/DB/中的序列化副本以创建无效值(例如,使s
小写)。反序列化回来时,“活动”实例将无效,除非readResolve
重写反序列化过程中使用的方法以防止这种情况发生。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)