Case class private constructor - необходимость реализации readResolve
Я был просто googling, чтобы узнать, как создать класс case с частным конструктором. Ниже приведен правильный способ сделать это, как описано в
Как переопределить приложение в компаньоне класса 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)
}
Ниже мое понимание:
Если мы объявим абстрактную тему класса, то реализация для метода copy и apply не будет сгенерирована компилятором.
Ниже приведен вопрос, с которым я борюсь: -
Почему требуется обеспечить реализацию readResolve?
Ответы
Ответ 1
Реализация readResolve существует для предотвращения создания недопустимых экземпляров класса case путем редактирования сериализованных копий класса.
В зависимости от того, насколько вы доверяете среде, в которой будет использоваться код, вы можете почувствовать, что можете спокойно проигнорировать этот риск.
Это происходит из-за того, что классы case расширяют Serializable
, и поэтому могут закончиться сериализацией и выпиской в файл (или DB или где бы то ни было). На этом этапе сериализованная копия в файле/DB/везде, где она может быть отредактирована, чтобы создать недопустимое значение (например, сделать s
нижний регистр). При десериализации обратно экземпляр "live" будет недействительным, если только метод readResolve
, который используется в процессе десериализации, не будет предотвращен.