2017-02-01 5 views
0

фон

Я пытаюсь преобразовать этот 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, я в порядке с вами.

ответ

0

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

enum class Status { 
    @EnumValue("N") NEW, 
    @EnumValue("A") ACTIVE, 
    @EnumValue("I") INACTIVE 
} 
Смежные вопросы