【发布时间】:2015-11-21 01:57:17
【问题描述】:
我只是在谷歌上搜索,以了解如何使用私有构造函数创建案例类。以下是正确的方法,如
中所述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类抽象,那么编译器就不会生成copy和apply方法的实现。
以下是我正在努力解决的问题:-
为什么需要提供 readResolve 的实现?
【问题讨论】:
-
我是您最初提出这个问题的另一个线程上答案的作者。我正在遵循基于 Joshua Bloch 在他的“Effective Java, 2nd Edition”一书中的建议的 JVM/Java 最佳实践。原帖:stackoverflow.com/a/25538287/501113
-
顺便说一句,为了更全面地了解 JVM/Java readResolve 方法和案例类的特殊性,这是我编写的文档(连同 CodeReview 更新),它深入探讨了为什么我希望始终防止实例化案例类的无效实例:docs.google.com/document/d/…
标签: scala constructor private