Я думаю, что вы можете сделать это, пометив конструктор @JvmOverloads
следующим образом:
data class DummyState @JvmOverloads constructor(
override val participants: List<AbstractParty>,
val myNewProperty: String = "blah"
) : ContractState
(не вводите номера версий в имена классов состояний)
@JvmOverloads
делает "старые" конструкторы видимыми для механизма десериализации для сопоставления.
Но, вероятно, здесь лучше указать строку кода:
val inDefault: Boolean get() = myNewProperty ?: false
или
fun priceOr(default: Amount<Currency> = 0.USD) get() = price ?: default
если вы действительно этого хотите.
Обратная совместимость и значения по умолчанию должны рассматриваться довольно осторожно. Распространенной ошибкой является использование значения по умолчанию ноль / пустая строка / ложь для вновь вводимых полей, даже если эти значения семантически значимы для приложения. То есть знание того, что в старом сообщении не указано что-то, является ценной информацией, которую нельзя потерять или заменить хрупкими дозорными значениями. Рассмотрим новое поле «цена». Цены не могут быть отрицательными, поэтому, возможно, разработчик устанавливает значение по умолчанию, равное нулю. Но ценить что-то как бесплатное - это значимая вещь - возможно, не в сегодняшнем бизнес-сценарии, а, возможно, завтра? Теперь у вас есть проблема.
Система типов и синтаксис Котлина очень хорошо справляются с отсутствующими значениями. Заменить стандартное значение на месте использования с помощью оператора ?:
так просто, что я бы беспокоился о том, чтобы установить соглашение о постоянном предоставлении стандартного значения на строительной площадке, которому следуют младшие разработчики, не зная о возможных последствиях. Явное разоблачение того факта, что по умолчанию может быть заменено, заставляет людей задуматься о том, действительно ли это логично.