2017-02-01 60 views
0

背景

我想這個Ebean例如從Java轉換成科特林: http://ebean-orm.github.io/docs/mapping/extension/dbenumvalue如何在Kotlin中使用@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; 
    } 
} 

科特林

我預計在以下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") 
} 

或許:

// 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參數的構造函數與getter方法註釋單獨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方法傳遞值)。
  • 是,即使對嗎?
  • 什麼是慣用的方式做到這一點?

任何解釋,修正,改進等,將不勝感激。如果你認爲這屬於對代碼審查,我和你一起移動就OK了。

回答

0

我認爲最乾淨的解決方案是使用@EnumValue代替@DbEnumValue的:

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