[英]Java (or Groovy) equivalent of Scala's apply
在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)
或FOO.call(42)
調用該構造函數的方法
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'
]
Groovy中的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()
但不能簡單
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.