У меня (часто) есть ресурс с двумя состояниями, предварительно созданными и созданными после, где оба состояния имеют одинаковые поля, за исключением поля id
. id
имеет значение NULL в предварительно созданном состоянии и не равно NULL в состоянии после создания.
Я хотел бы определить и использовать этот ресурс простым и безопасным для типов способом.
Распространено представлять это поле идентификатора как обнуляемое, которое обрабатывает оба сценария с минимальным образцом в определении класса. Проблема в том, что он создает много шаблонного элемента в бизнес-логике, потому что вы не можете утверждать, был ли ресурс предварительно создан или пост-создан, глядя на его тип.
Вот пример обнуляемого подхода:
data class Resource(val id: String?, val property: String)
Это просто определить, но не так просто обработать из-за отсутствия гарантий времени компиляции.
Вот пример более безопасного типа:
sealed class Resource(val property: String) {
class WithoutID(property: String): Resource(property)
class WithID(val id: String, property: String): Resource(property)
}
Это позволяет мне обойти Resource.WithID
и Resource.WithoutID
, которые имеют все те же поля и методы, за исключением id
.
Единственное неудобство, связанное с этим безопасным типом подходом, заключается в том, что код определения ресурса становится довольно раздутым, когда у вас много полей property
. Это вздутие живота делает код труднее для чтения.
Мне интересно, есть ли альтернативный подход с меньшим количеством шаблонов или есть ли у Kotlin какие-либо функции, которые делают подобные вещи проще.