Зарезервированные слова как имена или идентификаторы - PullRequest
22 голосов
/ 08 января 2009

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

Ответы [ 14 ]

38 голосов
/ 08 января 2009

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

27 голосов
/ 08 января 2009

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

11 голосов
/ 08 января 2009

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

9 голосов
/ 14 января 2009

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

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

Должен ли кто-то заниматься этим, это совершенно другой вопрос.

6 голосов
/ 08 января 2009

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

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

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

3 голосов
/ 25 ноября 2016

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

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

например.

@SerializedName("new")
private String New;
public String getNew ()
{
    return New;
}
public void setNew (String aNew)
{
    New = aNew;
}
3 голосов
/ 08 января 2009

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

class cl4ss {
  String r3turn() {
    return "but why?";
  }
}
2 голосов
/ 09 ноября 2009

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

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

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

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

2 голосов
/ 09 января 2009

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

int $return = 5;

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

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