Зарезервированные слова как имена переменных или методов

Есть ли какой-либо сложный способ использовать зарезервированные слова Java в качестве переменных или имен методов?

Нет, нет способа. Вот почему они обозначены как «зарезервированные».

Это правильный вопрос. Такое возможно на других языках. В C # префикс идентификатора с помощью @ ( как было задано ранее ); в Delphi, префикс с. Но Java не предлагает такой функции (отчасти потому, что на самом деле не нужно взаимодействовать с идентификаторами, определенными другими языками, как это делает мир .Net).

Чаще всего эта проблема возникает для «classа», в этом случае принято писать «clazz».

Нет, вы не можете этого сделать. Для получения дополнительной информации перейдите в раздел 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 

Строго говоря, вы не можете, если только не попадете в сложную реализацию компилятора, которая не соответствует спецификации языка 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"); } } 

Этот код является хорошо сформированным и допустимым classом Java. Однако, как вы уже догадались, есть небольшой трюк: символ «е» в «новом» идентификаторе не относится к набору символов ASCII, это на самом деле циррологический «е» (пронумерованный «YE»).

Текущая спецификация языка Java явно разрешает, и это важный момент, чтобы использовать Unicode для именования идентификаторов. Это означает, что у него есть возможность свободно называть ее или его занятия по-французски, по-китайски или по-русски, если они того пожелают. Также возможно смешивать и сопоставлять алфавиты в коде. И исторически, некоторые буквы в латинском и других алфавитах выглядят привлекательно.

В результате: нет, вы не можете использовать зарезервированные слова в качестве идентификаторов, но вы можете использовать идентификаторы, которые выглядят точно так же, как зарезервированные слова.

Должен ли кто-нибудь это делать, это совсем другое дело.

Да, есть. Вы должны использовать зарезервированные слова из будущего. Как и в случае с другими методами, называемыми assert () в коде pre-1.4.

Надеюсь, поможет!

А? Почему вы хотите это сделать? Вы можете записать их в l33t, чтобы обмануть компилятор.

 class cl4ss { String r3turn() { return "but why?"; } } 

Я знаю, что это старый вопрос, может помочь кому-то.

Это возможно, используя поддержку присвоения имен в полевых условиях GSON

например.

 @SerializedName("new") private String New; public String getNew () { return New; } public void setNew (String aNew) { New = aNew; } 

Достаточно плохо, что некоторые регистры, чувствительные к регистру, допускают такие вещи, как:

 class New; class Something { New makeNew() { return new New(); } } 

Но почему бы вам когда-нибудь захотеть написать строку кода следующим образом:

 class new; class Something { bool if; new makeNew() { return if ? new new() : null; } } 

Просто взгляните на подсветку синтаксиса. Даже он запутывается!

Невозможно использовать зарезервированные слова с компилятором javac .

Технически вы можете редактировать имена внутри файла classа после его компиляции, чтобы быть тем, что хотите: на этом этапе виртуальная машина не заботится, потому что она больше не имеет отношения к исходному коду. Я считаю, что некоторые обфускаторы используют эту технику.

PL / 1 (1960-е годы, посвященный программированию на мэйнфреймах IBM по-прежнему вокруг нас), довольно classно требовал, чтобы, хотя некоторые слова действуют как ключевые слова в определенных контекстах, все слова могут использоваться как идентификаторы. Это даже не так сложно сделать в синтаксическом анализаторе, если вы решите быть последовательным в этом. PL / 1 считался довольно большим langauge, и комитет langauge опасался, что многие программисты не узнают все это, а затем будут удивлены, когда они попытаются использовать ключевое слово из той части, которую они не знали как идентификатор , Поэтому вы можете писать такие вещи, как:

 IF BEGIN=ELSE THEN CALL=3 ELSE CALL FOO(ENDIF) ENDIF 

Как отмечают другие, способность делать это не является рекомендацией.

Разработчики Java решили, что количество ключевых слов в langauge было скромным и зарезервировало набор. Они даже зарезервировали «GOTO», который фактически не разрешен ни в одной реальной программе Java.

Не уверен, что вы пытаетесь сделать, но $ является допустимым символом в идентификаторах, поэтому вы можете сделать, скажем:

int $return = 5;

Это выглядит немного странно, но он работает.

В Scala вы можете использовать backticks. Например: myVarialbe.`class`

Interesting Posts
Давайте будем гением компьютера.