Закрытый конструктор класса case - необходим для реализации readResolve
Я просто гуглил, чтобы узнать, как создать класс case с приватным конструктором. Ниже приведен правильный способ сделать это, как описано в
Как переопределить применить в случае класса компаньон
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?
1 ответ
Реализация readResolve предназначена для предотвращения создания недопустимых экземпляров класса case путем редактирования сериализованных копий класса.
В зависимости от того, насколько вы доверяете среде, в которой будет использоваться код, вы можете чувствовать, что можете спокойно игнорировать этот риск.
Это происходит потому, что классы расширений Serializable
и так может закончиться сериализацией и записью в файл (или БД, или где-либо еще). На этом этапе сериализованная копия в файле /DB/ где угодно может быть отредактирована для создания недопустимого значения (например, создание s
нижний регистр). При десериализации обратно "живой" экземпляр будет недействительным, если только readResolve
метод, который используется в процессе десериализации, переопределяется, чтобы предотвратить это.