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

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

Ответы

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

Строго говоря, вы не можете, если только не попадете в сложную реализацию компилятора, которая не соответствует спецификации языка 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 для идентификации идентификаторов. Это означает, что у него есть возможность свободно называть ее или его занятия по-французски, по-китайски или по-русски, если они того пожелают. Также возможно смешивать и сопоставлять алфавиты в коде. И исторически, некоторые буквы в латинском и других алфавитах выглядят привлекательно.

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

class New;

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

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

class new;

class Something
{
    bool if;

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

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

Ответ 9

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

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

Ответ 10

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

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

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

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

Ответ 11

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

int $return = 5;

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

Ответ 12

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

Ответ 13

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

Это возможно с помощью GSON Поддержка имен полей

например.

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