用java代码构造kotlin类示例

bweufnob  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(320)

我有一个有15个字段的kotlin数据类。当我在kotlin代码中使用主构造函数构造此类的示例时,我可以利用有用的特性,例如:
省略具有默认值的字段
使用命名参数
然而,当从java代码构造这个kotlin类的示例时,我面临这样一个事实:我需要以正确的顺序提供构造函数中的所有15个参数,而不能命名它们。当这个java代码是一个单元测试时,这就特别不方便了,我对填充所有这些字段并不感兴趣,但是只有一两个字段对测试有用。
当使用纯java时,我不会面对这个问题,因为我会使用(lombok)构建器来构造对象的示例,具有只提供我感兴趣的字段的灵活性。
有没有办法缓解这个问题,或者这就是我混合java和kotlin所要付出的代价?

4xrmg8kj

4xrmg8kj1#

有没有办法缓解这个问题。。。
有点,但这不是现成的解决方案。更多信息请参见下文。
... 这是我混合java和kotlin的代价吗?
不,不是。如果我们解决这个问题,您会注意到java不能提供默认值,因此在与kotlin一起使用时不方便。复杂对象的构造是builder模式存在的主要原因。但是kotlin为我们提供了一个解决方案来避免大多数与复杂对象的构造相关的问题,并使构建器模式过时。

怎么处理?

解决方案不是一个而是多个。我会列出至少两个我马上想到的:
一级+二级建造师;
工厂。

一级+二级建造师

使用此选项,可以使用类应包含的全部参数列表创建主构造函数,并引入只接受必需值或默认情况下无法设置的值的二级构造函数:

class Example(val param1: Any, val param2: Any? = null, val param3: Any? = null) {
    // In this situation we have to use different argument names
    // to make explicit use of primary constructor.
    // e.g. if we remove `param1 = ` or rename `requiredParam` to `param1`
    // we will get an error saying: "There's a cycle in the delegation calls chain" 
    constructor(requiredParam: Any) : this(param1 = requiredParam)
}

工厂

就工厂而言,一切看起来都差不多。虽然这个解决方案在java中会更加冗长,但是它消除了使用命名参数的需要,并且让我们可以在对象初始化之前做更多的准备。我们甚至可以使它异步(就像是一个网络调用)!

class Example(val param1: Any, val param2: Any? = null, val param3: Any? = null) {
    object Factory {
        fun from(param1: Any): Example {
            return Example(param1)
        }
    }
}

结论

没有“正确”的解决方案。我们可以选一个我们喜欢的,或者找一个新的。
一级+二级建造师:
(+)从java使用时,不太冗长;
(-)如果二级构造函数发生更改,则必须更新java代码;
(-)要求构造函数参数使用不同的名称。
工厂:
(+)给了你更多的自由:例如,你可以在计算中计算一些东西 from 与构造函数相比,它的可读性更强;
(+)隐藏构造函数实现。以后您将能够在不修改任何java代码或工厂函数的情况下更改构造函数;
(-)在java中使用时会更加冗长。

相关问题