Java(或Groovy)相当于Scala的应用

时间:2014-09-18 19:13:23

标签: java groovy

在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来调用该构造函数的方法}}

2 个答案:

答案 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)

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()但不能是短手