根据条件选择重载函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据条件选择重载函数相关的知识,希望对你有一定的参考价值。

我在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,则调用方法的第一个变量并传递参数AB;否则,调用方法的第二个变体并仅传递参数A

有更简洁的解决方案吗?

答案

如果您喜欢使用动态和元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)

对我来说看起来更可读。希望能帮助到你。

另一答案

你可以做

Consumer<String> classNameConsumer = isUnix 
    ? cn -> TestAbstract.execute(cn, "JAVA_OPTS=/dev/urandom")
    : cn -> TestAbstract.execute(cn);
classNameConsumer.accept(className);

我猜这是否是一种“更好”的方式。

由于isUnix在运行时不会改变,我认为将消费者创建为静态最终类成员是安全的,这应该提高可读性。

以上是关于根据条件选择重载函数的主要内容,如果未能解决你的问题,请参考以下文章

课程作业03-动手动脑(随机数函数重载50!)

c++核心编程--函数的重载

Python代码阅读(第38篇):根据谓词函数和属性字符串构造判断函数

[C++]——函数的重载

C++ 函数重载,函数模板和函数模板重载,选择哪一个?

条件片段和导航重用