Java - Именование переменных с языковыми конфликтами [дубликат]

попробуйте это ...

Найти JSFIDDLE

17
задан Vlad Gudim 14 January 2009 в 21:23
поделиться

13 ответов

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

23
ответ дан Salty 19 August 2018 в 13:54
поделиться
  • 1
    Добавление & quot; _ & quot; перед зарезервированным ключевым словом, таким как «_new». это самая близкая вещь, которую вы получите. – NoName 3 November 2017 в 02:27

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

int $return = 5;

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

1
ответ дан Bohemian 19 August 2018 в 13:54
поделиться
  • 1
    Это похоже на @identifier в C #, хотя это не заканчивается тем же результатом (в C # «@» не становится частью идентификатора) – Hosam Aly 24 January 2009 в 09:38

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

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

33
ответ дан Community 19 August 2018 в 13:54
поделиться
  • 1
    Ну, если вы согласны принять взлом C #, вы можете префикс имен Java с ZZZ или любой другой последовательностью символов, которую вы в противном случае не использовали бы в качестве префикса. – Ira Baxter 8 November 2009 в 21:55
  • 2
    Но Ира, что изменяет идентификатор. Пути C # и Delphi удаляют исходное имя, но это все равно одно и то же имя. В Delphi вы можете даже написать полное имя без escape-символа. – Rob Kennedy 8 November 2009 в 22:01
  • 3
    Это становится особенно заметным в сериализации Xml или JSON, поскольку сериализованный текст будет иметь ZZZ как часть имени тега & lt; ZZZstring & gt; & lt; / ZZZstring & gt ;, тогда как в C # @string будет сериализоваться в & lt; string & gt; & lt; / string & gt; , – Rhyous 31 March 2016 в 22:21

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

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

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

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

2
ответ дан Ira Baxter 19 August 2018 в 13:54
поделиться

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

1
ответ дан Jack 19 August 2018 в 13:54
поделиться

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

class New;

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

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

class new;

class Something
{
    bool if;

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

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

2
ответ дан lc. 19 August 2018 в 13:54
поделиться
  • 1
    Вы можете высмеивать любую функцию, понимая, что ее потенциальные приложения ошибочны или дают плохие примеры. Это не означает, что лучшего использования не существует. Иногда зарезервированное слово действительно является самым естественным именем (как это часто бывает, когда используется идентификатор clazz oder klass). – Konrad Rudolph 14 January 2009 в 21:31
  • 2
    Я не думаю, что я был «плохим примером». Да, но не плохо. Возможно, самым естественным именем является зарезервированное слово, полезно ли использовать это имя? Зарезервированные слова зарезервированы по какой-либо причине. Легко отличить «класс» и «clazz». Можете ли вы различить «класс» и «класс»? – lc. 15 January 2009 в 08:00
  • 3
    Но не все языки согласны с тем, что зарезервированные слова. В Scala совершенно естественно назвать метод, который возвращает значение по умолчанию default. Это работает отлично, потому что default не является зарезервированным словом в Scala. Это, однако, зарезервированное слово на Java, поэтому вы не можете вызвать этот метод с Java, хотя у вас есть совершенно законные основания для этого. – Jörg W Mittag 25 August 2015 в 22:11

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

class cl4ss {
  String r3turn() {
    return "but why?";
  }
}
3
ответ дан Miserable Variable 19 August 2018 в 13:54
поделиться
  • 1
    Технически - вы никогда не обманываете компилятор, так как приведенный выше пример полностью легальный Java. – CodeMonkeyKing 4 August 2015 в 18:11

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

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

2
ответ дан Neil Coffey 19 August 2018 в 13:54
поделиться
  • 1
    Это помогло мне, спасибо – Jake Gaston 2 March 2018 в 17:21
  • 2
    Рад помочь @ jake gaston. Это обходной путь, который мне нужен в одном проекте, который уже определил переменные, которые нельзя было изменить. – SK16 3 March 2018 в 07:39

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

11
ответ дан starblue 19 August 2018 в 13:54
поделиться
  • 1
    Есть ли список альтернативных вариантов наилучшей практики для всех ключевых слов? – Ciro Santilli 新疆改造中心 六四事件 法轮功 9 April 2015 в 09:23

Строго говоря, вы не можете, если только не попадете в сложную реализацию компилятора, которая не соответствует спецификации языка 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, это на самом деле циррологическое «е» (prounanced «YE»).

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

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

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

6
ответ дан Vlad Gudim 19 August 2018 в 13:54
поделиться
  • 1
    Даун проголосовал за то, что эти трюки могут привести к ошибкам и поведению, которые нелегко понять. Почему бы не назвать его «n3w» или что-нибудь еще, поскольку оно предназначено для изменения поведения. – CodeMonkeyKing 13 July 2015 в 23:14
  • 2
    @CodeMonkeyKing, к сожалению, не все, а не в каждом сценарии, соответствуют лучшим соглашениям об именах, и вполне возможно, что кто-то может столкнуться с частью кода, которая включает идентификатор, который выглядит точно как зарезервированное слово и, с трудом скомплектован, скомпилирован без ошибок. Тогда этот ответ придет на помощь. Кроме того, он отвечает на заданный вопрос. «Должен ли кто-нибудь делать это совсем другое дело». – Vlad Gudim 4 August 2015 в 13:48
  • 3
    Если я проанализирую вопрос OP точно, ответ, который вы предлагаете, только кажется человеческому глазу ключевым словом и не является «сложным способом использования зарезервированного слова Java». Я бы сказал по опыту, что это самые трудные ошибки. Реальный ответ на этот вопрос заключается в том, что зарезервированные ключевые слова фактически зарезервированы. – CodeMonkeyKing 4 August 2015 в 18:04
  • 4
    Я чувствую, что этот ответ заслуживает «Не пытайтесь это дома (или на рабочем месте)». метка. – Chris Kerekes 26 May 2017 в 17:42

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

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

4
ответ дан Yoni Roit 19 August 2018 в 13:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: