Domanda

Esiste un modo complicato di usare le parole riservate di Java come nomi di variabili, metodi, classi, interfacce, pacchetti o enum?

È stato utile?

Soluzione

No, non c'è modo. Ecco perché sono etichettati "riservati".

Altri suggerimenti

Questa è una domanda valida. Una cosa del genere è possibile in altre lingue. In C #, aggiungi l'identificatore con @ ( come richiesto prima ); in Delphi, aggiungi il prefisso & amp; . Ma Java non offre tale funzionalità (in parte perché non ha davvero bisogno di interagire con identificatori definiti da altre lingue come fa il mondo .Net).

Molto spesso questo problema si presenta per " class " ;, in questo caso è consuetudine scrivere " clazz " ;.

A rigor di termini non è possibile, a meno che non si mettano le mani su un'implementazione del compilatore buggy che non aderisce alle specifiche del linguaggio Java.

Ma dove c'è una volontà, c'è un modo. Copia il seguente codice nel tuo IDE, cambia la codifica del file sorgente in UTF-16 e qui andiamo:

public class HelloWorld {

    public static void main(String[] args) {

        HelloWorld.nеw();
    }

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

}

Questo codice è una classe Java ben formata e valida. Tuttavia, come hai indovinato, c'è un piccolo trucco: il "& # 1077;" carattere all'interno di " nuovo " l'identificatore non appartiene al set di caratteri ASCII, in realtà è un "& # 1077;" in cirillico ('YE') in prounanza.

Le attuali specifiche del linguaggio Java consentono esplicitamente, e questo è un punto importante da sottolineare, l'uso di Unicode per identificare gli identificatori. Ciò significa che si ha la capacità di chiamare liberamente le sue lezioni in francese, cinese o russo se lo desiderano. È anche possibile mescolare e abbinare gli alfabeti all'interno del codice. E storicamente, alcune lettere in latino e altri alfabeti sono simili.

Di conseguenza: no, non puoi usare le parole riservate come identificatori, ma puoi usare identificatori che assomigliano esattamente a parole riservate.

Se qualcuno dovrebbe farlo, è una questione totalmente diversa.

No, non puoi farlo. Per ulteriori informazioni, visitare JLS Sezioni 3.8, 3.9

  

Le seguenti sequenze di caratteri,   formato da lettere ASCII, sono   riservato per l'uso come parole chiave e   non può essere utilizzato come identificatore (& # 167; 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

Sì, c'è. Devi usare parole riservate dal futuro. Come quello che è successo con diversi metodi chiamati assert () nel codice pre-1.4.

Spero che sia d'aiuto!

Eh? Perché vorresti farlo? Puoi scriverli in l33t, che inganneranno il compilatore.

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

So che è ancora una vecchia domanda, potrebbe aiutare qualcuno.

È possibile utilizzando Supporto per la denominazione dei campi

ad es.

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

È abbastanza male che alcune lingue con distinzione tra maiuscole e minuscole consentono cose come le seguenti:

class New;

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

Ma perché mai vorresti essere in grado di scrivere una riga di codice come questa:

class new;

class Something
{
    bool if;

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

Dai un'occhiata all'evidenziazione della sintassi. Anche si confonde!

Non è possibile utilizzare parole riservate con il compilatore javac .

Tecnicamente, puoi modificare i nomi all'interno del file di classe una volta che è stato compilato per essere tutto quello che vuoi: a quel punto, la VM non se ne cura, perché non ha più a che fare con il codice sorgente . Credo che alcuni offuscatori utilizzino questa tecnica.

PL / 1 (un linguaggio di programmazione mainframe IBM degli anni '60 ancora in circolazione oggi) richiedeva piuttosto notoriamente che mentre alcune parole si comportano come parole chiave in determinati contesti, tutte le parole possono essere usate come identificatori. Questo non è nemmeno così difficile da fare in un parser se hai deciso di essere coerente al riguardo. PL / 1 era considerato una lingua piuttosto grande, e il comitato della lingua si preoccupava del fatto che molti programmatori non avrebbero imparato tutto, e quindi sarebbero rimasti sorpresi quando avrebbero provato a usare la parola chiave da una parte che non conoscevano come identificatore . Quindi potresti scrivere cose come:

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

Come altri hanno notato qui, la possibilità di farlo non è una raccomandazione.

I progettisti Java hanno deciso che il numero di parole chiave nella lingua era modesto e hanno prenotato il set. Hanno persino prenotato "GOTO", che in realtà non è consentito in nessun vero programma Java.

Non sono sicuro di ciò che stai cercando di fare, ma $ è un carattere valido negli identificatori, quindi potresti fare:

int $ return = 5;

Sembra un po 'strano, ma funziona.

In Scala puoi usare i backtick. Ad esempio: myVarialbe`class`

Se hai davvero bisogno di usare un campo / variabile locale / metodo chiamato lo stesso di una parola riservata, ti suggerisco di aggiungere un carattere di sottolineatura alla fine del nome:

// JPA entity mapping class:

private Boolean void_;

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

È una scelta più leggibile (IMHO) rispetto all'aggiunta di caratteri all'inizio del nome (fVoid, aVoid, vVoid, ecc.)

Il codice sopra è un caso reale che mi è accaduto, lavorando con un database legacy, in cui la tabella fattura aveva un campo chiamato vuoto che indica se il documento era stato annullato o meno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top