Intereting Posts

Как использовать @DbEnumValue с Ebean в Котлине?

Задний план

Я пытаюсь преобразовать этот пример Ebean из Java в Kotlin: http://ebean-orm.github.io/docs/mapping/extension/dbenumvalue

Вот пример кода 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 в Kotlin, он делает это:

 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 дополнительная переменная dbValue ? (Я думаю, что передать значение от конструктора в общедоступный метод аннотированного get).
  • Это даже правильно?
  • Каков идиоматический способ сделать это?

Любые объяснения, исправления или улучшения будут оценены. Если вы считаете, что это относится к codeReview, я в порядке с вами.

Я считаю, что самым чистым решением является использование @EnumValue вместо @DbEnumValue:

 enum class Status { @EnumValue("N") NEW, @EnumValue("A") ACTIVE, @EnumValue("I") INACTIVE }