Groovy-添加类似于JS原型的方法吗?

时间:2018-11-13 22:09:41

标签: groovy

由于尚不确定Java上的JS的未来(在Java 11上已弃用JS / Nashorn),我一直在研究完全不在JS之外的选项,因为Groovy与Java相似且颇受欢迎,因此是主要的选择。

我目前正在使用JS / Nasahorn处理游戏服务器上的许多操作,尽管我可以看到很多可以转换为Groovy,但我确实担心如果可能的话我会遇到麻烦是否。

因此,在我的游戏服务器上,一直有新的可单击的地图对象和npc被添加(每个数以万计)。为了处理这些点击事件,我有JS类来处理它们。

要添加一个新的对象或npc动作,我有一组JS文件将ID分开,以使其不是一个巨大的文件。具体来说,我使用JS原型能够添加这些动作而无需使用相同的文件,而只是在运行时加载所有JS文件。

ObjectOption.prototype.object_0 = function(player, object) { }

然后我可以通过

从实际的JS类本身执行功能
ObjectOption.prototype["object_" + object.getID()](player, object);

this["object_" + object.getID()](player, object);

我的问题是,可以使用Groovy进行任何此类设置,还是超出Groovy的工作范围?

1 个答案:

答案 0 :(得分:1)

Groovy支持元编程,例如在运行时向现有类添加新方法。考虑以下示例:

class Person {
    void greetings(String name) {
        println "Greetings, $name!"
    }
}

Person.metaClass.hello = { String name -> println "Hello, $name!" }

def john = new Person()
john.greetings("Paul")
john.hello("Mary")

输出:

Greetings, Paul!
Hello, Mary!

在此示例中,我们有一个简单的Person类和一个方法greetings()。我们可以通过访问hello()对象并添加方法Person.metaClass作为闭包来接受新的方法hello,该闭包接受类型为name的单个参数String

选中Groovy's documentation on metaprogramming,您将在其中找到许多示例。