Ответ 1
Нет, нет способа. Вот почему они обозначены как "зарезервированные".
Есть ли какой-либо сложный способ использования зарезервированных слов Java в качестве переменных или имен методов?
Нет, нет способа. Вот почему они обозначены как "зарезервированные".
Это правильный вопрос. Такое возможно на других языках. В С# префикс идентификатора с @
(как задано до); в Delphi, префикс с &
. Но Java не предлагает такой функции (отчасти потому, что на самом деле не нужно взаимодействовать с идентификаторами, определенными другими языками, как это делает мир .Net).
Чаще всего эта проблема возникает для "класса", в этом случае принято писать "clazz".
Строго говоря, вы не можете, если только не попадете в сложную реализацию компилятора, которая не соответствует спецификации языка Java.
Но там, где есть желание, есть способ. Скопируйте следующий код в свою IDE, переключите кодировку исходного файла на UTF-16, и вот мы идем:
public class HelloWorld {
public static void main(String[] args) {
HelloWorld.nеw();
}
public static void nеw () {
System.out.println("Hello,World");
}
}
Этот код является хорошо сформированным и допустимым классом Java. Однако, как вы уже догадались, есть небольшой трюк: символ "е" в "новом" идентификаторе не принадлежит к набору символов ASCII, это на самом деле циррологический "е" (пронумерованный "YE" ).
Текущая спецификация языка Java явно разрешает, и это важный момент, чтобы использовать Unicode для идентификации идентификаторов. Это означает, что у него есть возможность свободно называть ее или его занятия по-французски, по-китайски или по-русски, если они того пожелают. Также возможно смешивать и сопоставлять алфавиты в коде. И исторически, некоторые буквы в латинском и других алфавитах выглядят привлекательно.
В результате: нет, вы не можете использовать зарезервированные слова в качестве идентификаторов, но вы можете использовать идентификаторы, которые выглядят точно так же, как зарезервированные слова.
Должен ли кто-нибудь делать это совсем другое дело.
Нет, вы не можете этого сделать. Для получения дополнительной информации перейдите на JLS Разделы 3.8, 3.9
Следующие последовательности символов, образованные из букв ASCII, являются зарезервированы для использования в качестве ключевых слов и не могут использоваться как идентификаторы (§3.8):
Keyword: one of abstract continue for new switch assert default if package synchronized boolean do goto private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while
Да, есть. Вы должны использовать зарезервированные слова из будущего. Как то, что произошло с другими методами, называемыми assert() в коде до 1.4.
Надеюсь, что это поможет!
А? Почему вы хотите это сделать? Вы можете записать их в l33t, чтобы обмануть компилятор.
class cl4ss {
String r3turn() {
return "but why?";
}
}
Достаточно плохо, что некоторые регистры, чувствительные к регистру, допускают следующие вещи:
class New;
class Something
{
New makeNew()
{
return new New();
}
}
Но зачем вам когда-нибудь хотеть писать строку кода следующим образом:
class new;
class Something
{
bool if;
new makeNew()
{
return if ? new new() : null;
}
}
Просто взгляните на подсветку синтаксиса. Даже он запутывается!
Невозможно использовать зарезервированные слова с помощью компилятора javac.
Технически вы можете изменить имена внутри файла класса после компиляции, чтобы быть тем, что хотите: на этом этапе виртуальная машина не заботится, потому что она больше не имеет отношения к исходному коду, Я считаю, что некоторые обфускаторы используют эту технику.
PL/1 (язык программирования IBM с мейнфреймом 1960 года, который все еще существует сегодня), довольно классно требовал, чтобы, хотя некоторые слова действуют как ключевые слова в определенных контекстах, все слова могут использоваться как идентификаторы. Это даже не так сложно сделать в синтаксическом анализаторе, если вы решите быть последовательным в этом. PL/1 считался довольно большим langauge, и комитет langauge опасался, что многие программисты не узнают все это, а затем будут удивлены, когда они попытаются использовать ключевое слово из той части, которую они не знали как идентификатор, Поэтому вы можете писать такие вещи, как:
IF BEGIN=ELSE THEN CALL=3 ELSE CALL FOO(ENDIF) ENDIF
Как отмечали другие, способность делать это не рекомендуется.
Разработчики Java решили, что количество ключевых слов в langauge было скромным и зарезервировало набор. Они даже зарезервировали "GOTO", который фактически не разрешен ни в одной реальной программе Java.
Не уверен, что вы пытаетесь сделать, но $является допустимым символом в идентификаторах, поэтому вы можете сделать, скажем:
int $return = 5;
Это выглядит немного странно, но он работает.
В Scala вы можете использовать обратные ссылки. Например: myVarialbe.`class`
Я знаю, что старый вопрос все же может помочь кому-то.
Это возможно с помощью GSON Поддержка имен полей
например.
@SerializedName("new")
private String New;
public String getNew ()
{
return New;
}
public void setNew (String aNew)
{
New = aNew;
}