java - 根据条件选择重载函数

标签 java groovy

我在 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

有没有更简洁的解决方案?

最佳答案

您可以尝试使用GroovyObject.invokeMethod(methodName, args)如果您喜欢使用动态和元 Groovy 功能​​,请使用元编程方法。它允许您定义一个调用方法的位置并预先定义参数列表。考虑以下示例:

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)

对我来说看起来更具可读性。希望对您有所帮助。

关于java - 根据条件选择重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49106125/

相关文章:

java - 带 ARM 的 Box2d 旋转关节车辆

java - 如何实现引用 main 中定义的父对象的静态方法?

groovy - 如何在Griffon中轻松显示/隐藏 View

c# - 将 N 个 Excel 工作簿中的第 X 个工作表复制到新工作簿中 - 使用哪种语言?

hibernate - 如何检查大写和小写的字符串

java - 在maven项目中使用spring boot

java - 中文(简体和繁体)和韩文文本的字符损坏

grails - 在文件中未生成日志

java - 我如何设置 eclipse 以与 tomcat 一起运行

grails - 没有登录项目URL应该无法在常规中使用