gpt4 book ai didi

java - 具有Java向后兼容性的Kotlin optional 参数

转载 作者:行者123 更新时间:2023-12-02 12:44:52 26 4
gpt4 key购买 nike

我目前正在用一个对象编写Kotlin库,该对象具有多个需要多个 optional 参数的方法。因为在JAVA中,您需要将null传递给那些参数,所以我认为这是不可理解的。另外,重载也不是解决方案,因为我不知道可能的组合是什么,或者有很多方法可以实现。

class MyObj() {
fun method1(param1: Int, param2: String? = null, param3: Int? = null): String { ... }
fun method2(param1: Int, param2: Float? = null, param3: String? = null): Any { ... }
fun method5(param1: Int, ...): User { ... }
}
在Kotlin中,我可以简单地写:
myObj = MyObj()
myObj.method1(param1 = 4711, param3 = 8850)
在Java中,我需要编写:
MyObj myObj = new MyObj()
myObj.method1(4711, null, 8850)
...
myObj.method5("abc", null, null, null, null, 8850, null, null, "def")
因为我有很多方法和很多 optional 参数,所以我考虑只为每个方法传递一个类:
/** For JAVA backwards compatibility */
class Method1(
val param1: Int
) {
param2: String? = null
param3: Int? = null

fun withParam2(value: String) = apply { param2 = value }
fun withParam3(value: Int) = apply { param3 = value }
}

class MyObj() {
fun method1(param1: Int, param2: String? = null, param3: Int? = null): String { ... }

/** For JAVA backwards compatibility */
fun method1(values: Method1) = method1(values.param1, values.param2, values.param3)
}
因此,在Kotlin中,我可以使用命名参数,而在Java中,我可以简单地编写:
MyObj myObj = new MyObj()
myObj.method1(new Method1(4711).withParam3(8850))
从我的角度来看,它看起来很难看,因为我总是不得不说 method1(new Method1())method2(new Method2())您认为这有一个更优雅的版本吗?
背景:这是用于调用带有许多 optional 参数的REST API。

最佳答案

对于Java,处理大量 optional 参数的最佳方法通常是通过某种形式的构建器模式。我建议两个变体之一:
1:返回一个可链接对象,并在末尾具有某种“运行”方法以采用提供的参数并运行实际方法。

myObj.retrieveWhatever().from("abc").where(LESS_THAN, 3).setAsync(true).run();
2:对于Java 8+,请执行相同操作,但要使用lambda:
myObj.retrieveWhatever(args -> 
args.from("abc").where(LESS_THAN, 3).setAsync(true)
);
...或者
myObj.retrieveWhatever(args -> {
args.from("abc");
args.where(LESS_THAN, 3);
args.setAsync(true);
});
通过在lambda中执行此操作,您消除了忘记最后忘记 .run()调用的风险。

关于java - 具有Java向后兼容性的Kotlin optional 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62713506/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com