простой выход
Просто дайте ему конструктор без аргументов без каких-либо установщиков. Это будет изменчиво, но немного менее хаотично c, чем если бы вы предоставили все сеттеры. Когда вы используете Kryo в качестве десериализатора (что, я думаю, вы уже используете), вы можете оставить этот конструктор закрытым.
Конструктор All-Args все еще может вызываться с нулевыми значениями и нечувствительными значениями. Если вы хотите навязать какой-либо договор о действительности объекта, используйте проверку явно. Если вам нужна неизменность, ваши участники больше не будут финальными, используя конструктор без аргументов.
dynamici c природа создания объекта
Десериализация работает, вызывая простейший (без аргументов) конструктор, поскольку это гораздо проще реализовать для авторов используемой утилиты, чем собирать один вызов для всех -args конструктор со всеми необходимыми свойствами, порядок которых может быть произвольным и назначение свойств объекта не гарантируется.
Вместо этого они создают объект vanila и заполняют его через сеттеры или отражения, следя за тем, чтобы имена совпадали между сериализованной и объектной версиями. All-args конструктор сделает это менее надежно и его будет гораздо сложнее реализовать.
Создание пользовательских объектов в Kryo
Если вам нужно сохранить неизменность, вы должны использовать создание пользовательских объектов. Пожалуйста, посмотрите на пример Kryo для создания пользовательских объектов :
Registration registration = kryo.register(SomeClass.class);
registration.setInstantiator(new ObjectInstantiator<SomeClass>() {
public SomeClass newInstance () {
return new SomeClass("some constructor arguments", 1234);
}
});