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

Другие вопросы по тегам