我在Groovy中有一个重载方法,我根据条件调用:
Boolean isUnix = getIsUnix()
Map result
if (isUnix) {
result = TestAbstract.execute(className, "JAVA_OPTS=/dev/urandom")
} else {
result = TestAbstract.execute(className)
}
有没有更好的方法来达到相同的效果?类似的东西:
TestAbstract.execute(className, isUnix ? "additionalParam" : )
请注意,我不需要以下内容:
TestAbstract.execute(className, isUnix ? "additionalParam" : "") //this is bad
因为它会覆盖字符串的可能默认值。我想有条件地调用一个方法的两个重载变体:
如果为true,请调用方法的第一个变体并传递参数A
和B
;否则,调用方法的第二个变体并仅传递参数A
。
是否有更简洁的解决方案?
答案 0 :(得分:2)
你可以做到
Consumer<String> classNameConsumer = isUnix
? cn -> TestAbstract.execute(cn, "JAVA_OPTS=/dev/urandom")
: cn -> TestAbstract.execute(cn);
classNameConsumer.accept(className);
这是否是一个更好的&#34;我觉得这种方式很合适。
由于isUnix
在运行时不会发生变化,因此我认为将消费者创建为静态最终类成员是安全的,这样可以提高可读性。
答案 1 :(得分:2)
如果您喜欢使用动态和元Groovy功能,可以尝试使用GroovyObject.invokeMethod(methodName, args)
元编程方法。它允许您定义调用方法的单个位置,并预先定义参数列表。请考虑以下示例:
class TestAbstract {
static void execute(String className, String params = "defaults") {
println "Executing with className = '${className}' and params = '${params}'"
}
}
def runTest(boolean isUnix) {
def params = ['MyClassName']
if (isUnix) {
params << 'additionalParam'
}
TestAbstract.invokeMethod('execute', params as Object[])
}
runTest(true)
runTest(false)
在此示例中,TestAbstract.execute(className, params)
使用第二个方法参数的默认值。 GroovyObject.invokeMethod(className, args)
期望第二个参数是参数数组,因此我们可以根据需要传递单个元素数组或两个元素数组。
运行此示例会产生以下输出:
Executing with className = 'MyClassName' and params = 'additionalParam'
Executing with className = 'MyClassName' and params = 'defaults'
即使你能以元/动态的方式做到这一点,我会说:
isUnix ? TestAbstract.execute(className, additionalParam) : TestAbstract.execute(className)
对我来说更具可读性。希望它有所帮助。