【问题标题】:How to create a Java instance of the object from Kotlin data class but don't include all fields?如何从 Kotlin 数据类创建对象的 Java 实例但不包含所有字段?
【发布时间】:2019-01-10 08:57:04
【问题描述】:

我有以下 Kotlin 数据类:

data class Filter @JvmOverloads constructor(
        val key: String? = null,
        val operation: String? = null,
        val value: String? = null,
        val group: String? = null,
        val searchInTranslations: Boolean? = null)

我在 Java 代码中创建了这个类的一个实例。但我想创建一个包含除group 字段之外的所有字段的实例。我怎样才能在Java中做到这一点?

我无法为 group 分配默认值,因为在某些 Java 类中我确实为该字段分配了一个值,而在其他 Java 类中我需要在创建对象时忽略该字段。

【问题讨论】:

    标签: java kotlin dto data-class


    【解决方案1】:

    Java 不支持这个,但是你可以做一个简单的技巧。

    生成两个构造函数,一个带有可选字段group,一个没有它。 因此,从不需要为该字段分配值的类中,只需调用第二个构造函数:

    public YourClass(String key, String operation, String value, bool search) 
    {
      this (key, operation, value, null, search); //null for the groups
    }
    

    【讨论】:

    • 谢谢!如果 group 字段是唯一可能需要或不需要的字段,这将起作用。如果下次我不需要包含 value 字段 - 我需要创建另一个构造函数。我在想也许这种方法有一个通用的解决方案。
    • 哦,我明白你的意思了。我认为您可以使用某种类型的工厂机制来选择正确的构造函数。无论如何,您是否考虑过不创建构造函数(因此只保留默认构造函数),而只使用 setter 初始化字段?
    • 是的,我正在考虑使用 setter 设置值,但我喜欢 Kotlin 中的数据类实现,因此开始以这种方式使用它。您是否建议使用常规类(不是数据类)并定义 setter 和 getter?
    • 如果你真的没有一个固定的结构(例如,A 类型永远不会得到组,B 类型永远不会得到操作),你可以很容易地用你的不同(固定)创建一个构造函数工厂构造函数的数量。但是,如果您真的不知道传入的确切数据类型,我相信 setter 方法会更合适。无论如何,这只是一个哲学问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    相关资源
    最近更新 更多