【问题标题】:How to use @DbEnumValue with Ebean in Kotlin?如何在 Kotlin 中将 @DbEnumValue 与 Ebean 一起使用?
【发布时间】: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


    【解决方案1】:

    我认为最干净的解决方案是使用@EnumValue 而不是@DbEnumValue:

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

    【讨论】:

      【解决方案2】:

      我认为第二种方式是最干净的,只是有点语法错误

      enum class Status(@get:DbEnumValue val value: String) {
          NEW("N"),
          ACTIVE("A"),
          INACTIVE("I")
      }
      

      kotlin 文档链接:Annotation Use-site Targets

      【讨论】:

      • 你应该添加一些解释。仅仅粘贴代码并不是帮助他人的好方法。
      • 啊,你添加了get: - 有道理。我得试试看。
      • @akuzminykh 好的,我改好了
      猜你喜欢
      • 2021-03-21
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      相关资源
      最近更新 更多