Pergunta

Existe alguma maneira complicada de usar palavras reservadas Java como variável, método, classe, interface, pacote ou enum nomes constantes?

Foi útil?

Solução

Não, não há como. É por isso que eles são rotulados como "reservados".

Outras dicas

Esta é uma pergunta válida. Tal coisa é possível em outros idiomas. Em C#, prefixo o identificador com @ (como perguntado antes); em Delphi, prefixo com &. Mas o Java não oferece esse recurso (em parte porque realmente não precisa interagir com os identificadores definidos por outros idiomas da maneira como o mundo .NET faz).

Na maioria das vezes, esse problema surge para "classe", neste caso é habitual escrever "clazz".

Estritamente falando, você não pode, a menos que você coloque suas mãos em uma implementação do compilador de buggy que não adere à especificação da linguagem Java.

Mas onde há vontade, há um caminho. Copie o seguinte código para o seu IDE, alterne o arquivo de origem que codifica para o UTF-16 e aqui vamos nós:

public class HelloWorld {

    public static void main(String[] args) {

        HelloWorld.nеw();
    }

    public static void nеw () {
        System.out.println("Hello,World");
    }

}

Este código é uma classe Java bem formada e válida. No entanto, como você adivinhou, há um pequeno truque: o personagem 'е' dentro do identificador "novo" não pertence ao conjunto de caracteres ASCII, na verdade é um cirrílico 'i' (priorado 'ye').

As especificações atuais da linguagem Java permite explicitamente, e esse é um ponto importante a ser feito, o uso do Unicode para nomear identificadores. Isso significa que alguém tem a capacidade de chamá -la livremente em francês, chinise ou russo, se quiserem. Também é possível misturar e combinar os alfabetos dentro do código. E historicamente, algumas cartas dentro de latim e outros alfabetos são parecidos.

Como resultado: não, você não pode usar as palavras reservadas como identificadores, mas pode usar identificadores que se parecem exatamente com palavras reservadas.

Se alguém deveria estar fazendo isso é uma questão totalmente diferente.

Não, você não pode fazer isso. Para mais informações, vá para JLS Seções 3.8, 3.9

As seguintes sequências de caracteres, formadas a partir de letras ASCII, são reservadas para uso como palavras -chave e não podem ser usadas como identificadores (§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

Sim existe. Você precisa usar palavras reservadas do futuro. Como o que aconteceu com diferentes métodos chamados Assert () no código pré-1.4.

Espero que ajude!

Huh? Por que você gostaria de fazer isso? Você pode escrevê -los em L33T, que enganará o compilador.

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

Eu sei que ainda é uma pergunta antiga, pode ajudar alguém.

É possível usando o GSON's Suporte de nomeação de campo

por exemplo.

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

É ruim o suficiente alguns idiomas sensíveis ao caso permitem coisas como as seguintes:

class New;

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

Mas por que você gostaria de poder escrever uma linha de código como este:

class new;

class Something
{
    bool if;

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

Basta dar uma olhada no destaque da sintaxe. Mesmo fica confuso!

Não há como usar palavras reservadas com o Javac compilador.

Tecnicamente, você pode Edite os nomes dentro do arquivo de classe depois de compilado Para ser o que você quiser: nessa fase, a VM não se importa, porque não está mais lidando com o código -fonte. Acredito que alguns ofuscadores usam essa técnica.

PL/1 (a linguagem de programação do mainframe IBM dos anos 60 ainda hoje por aí) exigia que algumas palavras agissem como palavras -chave em certos contextos, todas as palavras possam ser usadas como identificadores. Isso nem é tão difícil de fazer em um analisador, se você se propunha a ser consistente com isso. Pl/1 foi considerado um grande Langauge, e o comitê de Langauge preocupou -se com o fato de muitos programadores não aprenderiam tudo, e depois ficariam surpresos quando tentaram usar a palavra -chave de uma parte que não conheciam como identificador . Então você poderia escrever coisas como:

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

Como outros observaram aqui, a capacidade de fazer isso não é uma recomendação.

Os designers Java decidiram que o número de palavras -chave no Langauge era modesto e reservou o conjunto. Eles até reservavam 'Goto', que não é permitido em nenhum programa Java real.

Não tenho certeza do que você está tentando fazer, mas $ é um personagem válido em identificadores, para que você possa fazer, digamos:

int $return = 5;

Parece um pouco estranho, mas funciona.

Em Scala, você pode usar backsticks. Por exemplo: myvarialbe.`class`

Se você realmente precisa usar uma variável/método local de campo/local denominada o mesmo que uma palavra reservada, sugiro anexar um sublinhado no final do nome:

// JPA entity mapping class:

private Boolean void_;

public Boolean getVoid_() { ... }
void setVoid_(Boolean void_) { ... }

É uma escolha mais legível (IMHO) do que anexar chars no início do nome (FVoid, Evite, Vvoid, etc.)

O código acima é um caso do mundo real que aconteceu comigo, trabalhando com um banco de dados herdado, no qual o invoice A tabela tinha um campo chamado void indicando se o documento foi anulado ou não.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top