Как получить компилятор Java для вставки имени переменной в строку - PullRequest
5 голосов
/ 03 марта 2010

Я часто пишу такой код:

throwExceptionWhenEmpty(fileType, "fileType");
throwExceptionWhenEmpty(channel, "channel");
throwExceptionWhenEmpty(url, "url");

Метод throwExceptionWhenEmpty делает что-то вроде этого:

private void throwExceptionWhenEmpty(final String var, final String varName) {
    if (var == null || var.isEmpty()) {
        throw new RuntimeException("Parameter " + varName + " may not be null or empty.");
    }
}

Я бы хотел избежать этой очевидной избыточности, передавая имя переменной в виде строки. Есть ли способ, которым компилятор Java может вставить имя переменной в строку для меня?

Я был бы счастлив, если бы мог написать что-то вроде этого:

throwExceptionWhenEmpty(fileType, nameOf(fileType));

Ответы [ 5 ]

3 голосов
/ 03 марта 2010

Это должно ответить на ваш вопрос: SO: Как получить имя переменной .

Это (легко) невозможно в Java.

Вы можете использовать препроцессор и интегрировать его в процесс сборки. Это, вероятно, было бы очень просто и переносимо. Но, как сказал Стивен С. в разделе комментариев, это на самом деле не Java, и поэтому не рекомендуется.

2 голосов
/ 03 марта 2010

Нет, Java не может сделать это, пока не начнет поддерживать замыкания, которые делают поля (и методы) первоклассными гражданами языка программирования.

См. http://docs.google.com/Doc?id=ddhp95vd_6hg3qhc для обзора одного из предложений, в котором вы можете делать то, что вы хотите, используя синтаксис #field.

2 голосов
/ 03 марта 2010

У Java на самом деле нет способа сделать это, но вы можете получить некоторую помощь от вашей IDE (если вы ее используете). В Eclipse вы можете создать такой шаблон, который может помочь:

throwExceptionWhenEmpty(${varname}, "${varname}");
${cursor}
2 голосов
/ 03 марта 2010

Имена переменных теряются при компиляции кода, поэтому, если Reflection не предоставляет доступ к ним (и даже тогда), я почти уверен, что это невозможно.К сожалению.

0 голосов
/ 03 марта 2010

Вы можете сделать что-то вроде (возможно, я неправильно понимаю, что вы хотите сделать)

var.getClass (). GetName ()

Где Var - ваш Объект, переданный в метод как Объект.

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