【发布时间】:2017-02-01 17:45:19
【问题描述】:
背景
我正在尝试将这个 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;
}
}
科特林
我在 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 参数与单独的 value 字段与注释的 getter 组合起来感觉有点浪费。
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变量? (我认为将值从构造函数传递给公共带注释的 get 方法)。 - 这样对吗?
- 这样做的惯用方法是什么?
如有任何解释、更正或改进,我们将不胜感激。如果你认为这属于 codeReview,我同意你移动它。
【问题讨论】:
标签: java intellij-idea annotations kotlin ebean