¿Cómo usar @DbEnumValue con Ebean en Kotlin?

Fondo

Estoy intentando convertir este ejemplo de Ebean de Java en Kotlin: http://ebean-orm.github.io/docs/mapping/extension/dbenumvalue

Aquí está el código de muestra de 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; } } 

Kotlin

Esperaba lo siguiente en Kotlin:

 // 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") } 

O tal vez:

 // ERROR: Expecting , or ) after "value:String" enum class Status(val value:String @DbEnumValue(storage = DbEnumType.VARCHAR) get() = value) { NEW("N"), ACTIVE("A"), INACTIVE("I") } 

Lo siguiente tiene sentido para mí y en realidad comstack, pero la combinación del parámetro dbValue para el constructor con un campo de value separado con getter para la anotación se siente de alguna manera derrochador.

 enum class Status (val dbValue:String) { NEW("N"), ACTIVE("A"), INACTIVE("I"); val value: String @DbEnumValue(storage = DbEnumType.VARCHAR) get() = dbValue } 

Cuando dejo que IntelliJ convierta Java a Kotlin, hace esto:

 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 } } 

Agregué la anotación a lo que produjo IntelliJ, pero me llevó varias suposiciones averiguar dónde ponerla.

Preguntas

  • ¿Por qué private constructor ?
  • ¿Por qué var value sin get ()?
  • ¿Qué es internal set ?
  • ¿Por qué init ?
  • ¿Por qué la variable extra dbValue ? (Creo que para pasar el valor del constructor al método public get anotado).
  • ¿Eso es incluso correcto?
  • ¿Cuál es la forma idiomática de hacer esto?

Cualquier explicación, corrección o mejora sería apreciada. Si crees que esto pertenece a codeReview, estoy de acuerdo con que lo muevas.