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, который используется в процессе десериализации, не будет предотвращен.