在Scala中,如果有Foo
的对象apply(x: Int)
,我可以使用Foo(42)
(作为Foo.apply(42)
的简写)来调用它。
是否可以在Java或Groovy中复制它?我原以为Groovy call
的功能可能类似,但def call(int x)
或static def call(int x)
都没有调用call
编辑:按要求添加示例DSL
典型/现有DSL:alter 't' add 'a' storing BAR
(其中BAR
是枚举)。
试图在上面添加一些代替BAR
的内容但会接受一个参数但却没有区别 的内容,理想情况是:alter 't' add 'a' storing FOO(42)
我已经创建了FOO作为一个带有接受int的构造函数的类 - 我现在正在寻找的是一种通过FOO(42)
而不是new FOO(42)
或{{1来调用该构造函数的方法}}
答案 0 :(得分:3)
Groovy中直截了当的方法是在类上编写static call()
方法,但它不会使Clazz()
起作用。这可能是一个错误,但我无法找到关于它的JIRA。
我想建议使用闭包:
import groovy.transform.Canonical as C
@C class Bar { def bar }
@C class Baz { def baz }
A = { new Bar(bar: it) }
B = { new Baz(baz: it) }
assert A("wot") == new Bar(bar: "wot")
assert B("fuzz") == new Baz(baz: "fuzz")
更新:似乎类名在被调用者上下文中被解析为静态方法调用,这可行(但它在DSL中不可用):
class A {
static call(str) { str.toUpperCase() }
}
assert ((Class)A)("qwop") == "QWOP"
更新2:根据您的DSL示例,删除parens是否可行?
class FOO {}
def params = [:]
alter = {
params.alter = it
[add : {
params.add = it
[storing: {
params.clazz = it
[:].withDefault { params.param = it }
}]
}]
}
alter 't' add 'a' storing FOO 42
assert params == [
alter : 't',
add : 'a',
clazz : FOO,
param : '42'
]
答案 1 :(得分:0)
Closure
方法call()
可以省略:
def action = { a, b = 1 -> println "$a and $b" }
action.call 1 // prints "1 and 1"
action( 1, 3 ) // prints "1 and 3"
在Java中,最接近的选择是Runnable
:它提供no-arg run()
但不能是短手