Groovy - добавление методов, аналогичных прототипу JS? - PullRequest
0 голосов
/ 14 ноября 2018

Поскольку будущее JS на Java неясно (JS / Nashorn устарела на Java 11), я изучал варианты, полностью выходящие за рамки JS, Groovy - основной, учитывая его популярность и сходство с Java.

В настоящее время я использую JS / Nasahorn для обработки большого количества действий для игрового сервера, и хотя многие из них, которые я вижу, могут быть преобразованы в Groovy, у меня есть одно беспокойство, что у меня возникают проблемы с выяснением, если это возможно или нет.

Итак, на моем игровом сервере постоянно появляются новые интерактивные объекты карты и npcs (общее количество каждого из них составляет десятки тысяч). Чтобы справиться с этими действиями при нажатии, у меня есть классы JS для их обработки.

Чтобы добавить новый объект или действие NPC, у меня есть группы файлов JS, которые разделяют идентификаторы так, чтобы это не был один гигантский файл. В частности, я использую прототип 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 голосов
/ 14 ноября 2018

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 по метапрограммированию , там вы найдете много примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...