фон
Я пытаюсь преобразовать этот Ebean пример из Java в Котлин: http://ebean-orm.github.io/docs/mapping/extension/dbenumvalueКак использовать @DbEnumValue с Ebean в Котлине?
Вот пример кода Java:
public enum Status {
NEW("N"),
ACTIVE("A"),
INACTIVE("I");
String dbValue;
Status(String dbValue) {
this.dbValue = dbValue;
}
// annotate a method that returns the value
// in the DB that the enum element maps to
@DbEnumValue
public String getValue() {
return dbValue;
}
}
Котлин
Я ожидал следующее Котлин:
// ERROR: This annotation is not available to target 'value parameter'
enum class Status(@DbEnumValue(storage = DbEnumType.VARCHAR) value: String) {
NEW("N"),
ACTIVE("A"),
INACTIVE("I")
}
Или, может быть:
// ERROR: Expecting , or) after "value:String"
enum class Status(val value:String
@DbEnumValue(storage = DbEnumType.VARCHAR)
get() = value) {
NEW("N"),
ACTIVE("A"),
INACTIVE("I")
}
Следующие имеет смысл для меня, и на самом деле компилирует, но сочетание параметра dbValue
для конструктора с отдельной value
поля с геттером для аннотирования чувствует расточительно каким-то образом.
enum class Status (val dbValue:String) {
NEW("N"),
ACTIVE("A"),
INACTIVE("I");
val value: String
@DbEnumValue(storage = DbEnumType.VARCHAR)
get() = dbValue
}
Когда я позволил IntelliJ преобразовать Java в Котлин, он делает это:
enum class Status private constructor(dbValue: String) {
NEW("N"),
ACTIVE("A"),
INACTIVE("I");
var value: String internal set
init {
@DbEnumValue(storage = DbEnumType.VARCHAR)
this.value = dbValue
}
}
я добавил аннотацию к тому, что произвел IntelliJ, но мне потребовалось несколько догадок, чтобы выяснить, где поставить его ,
Вопросы
- Почему
private constructor
? - Почему
var value
без get()? - Что такое
internal set
? - Почему
init
? - Почему дополнительные
dbValue
переменная? (Я думаю, что передать значение от конструктора в общедоступный метод аннотированного get). - Это даже верно?
- Что такое идиоматический способ сделать это?
Любое объяснение, исправление или улучшение будут оценены. Если вы считаете, что это относится к codeReview, я в порядке с вами.