Правильный способ создания классного класса - PullRequest
2 голосов
/ 05 июня 2019

Я хочу создать класс Groovy, и у меня есть некоторые проблемы

Мой первый выбор - использовать GroovyShell :

groovy-script:

class Foo {
    public String doStuff(String stuff) {
        return stuff + "_utils";
    }
}
new Foo(); // ??

main-script:

GroovyShell shell = new GroovyShell();
Script script = shell.parse(new File(path));
def clazz = script.run();
String result = clazz.doStuff("test");
print(result); // test_utils;

Второй вариант - использовать GroovyClassLoader :

groovy-script

class Foo {
    public String doStuff(String stuff) {
        return stuff + "_utils";
    }
}

main-script

GroovyClassLoader loader = new GroovyClassLoader();
Script script = loader.parseClass(new File(path))
Object clazz = script.newInstance();
Object[] args = new Object[1];
args[0] = "test";
String result = clazz.invokeMethod("doStuff", args);
print(result) // test_utils

Оба будут работать нормально, я бы предпочел использовать GroovyShell, потому что я использую его везде в моем текущем коде, но я не знаю, может ли new Foo() внутри моих сценариев вызвать утечки памяти,Возможно ли это?

Ответы [ 2 ]

1 голос
/ 05 июня 2019

GroovyShell использует GroovyClassLoader по умолчанию. Поэтому, если вам не нужны какие-либо дополнительные специфические функции, предоставляемые GroovyClassLoader, вам следует придерживаться GroovyShell, чтобы сохранить его простоту. GroovyShell и GroovyClassLoader являются примерами сборки мусора, и я не верю, что утечки памяти ни для одного из них.

0 голосов
/ 06 июня 2019

После @ помощи Даггетта мне удалось найти решение, которое соответствует моим потребностям.

Я вообще не буду использовать классы Groovy.

Простой пример

утилита groovy script:

String doStuff() {
    return "doStuff";
}

String doStuff2(){
    return "doStuff2";
}

вызов служебных методов из основного скрипта groovy

GroovyShell shell = new GroovyShell();
Script utilsScript = shell.parse(new File(PATH_TO_UTIL_SCRIPT));
String result = utilsScript.doStuff();
println(result); // doStuff;
String result2 = utilsScript.doStuff2();
println(result2); // doStuff2;

Это не ответ на оригинальный вопрос, но так как он соответствует моим потребностямя в порядке.

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