Frage

Gibt es eine komplizierte Weise Java zu verwenden Worte wie Variable reserviert, Methode, Klasse, Schnittstelle, Paket, oder Enum konstante Namen?

War es hilfreich?

Lösung

Nein, es gibt keinen Weg. Deshalb sind sie mit „reserviert“.

Andere Tipps

Dies ist eine berechtigte Frage. So etwas ist möglich in anderen Sprachen. In C # Präfix die Kennung mit @ ( nach wie vor gefragt); in Delphi, Präfix mit &. Aber Java bietet keine solche Funktion (zum Teil, weil es nicht wirklich mit Kennungen von anderen Sprachen die Art und Weise definiert zu interagieren muss die .NET-Welt der Fall ist).

Am häufigsten diese Frage aufkommt für „Klasse“, in diesem Fall ist es üblich, „clazz“ zu schreiben.

Genau genommen kann man nicht, wenn Sie Ihre Hände auf einer Buggy Compiler Implementierung erhalten, die nicht auf die Java-Sprache spec haften bleibt.

Aber wo ein Wille ist, ist auch ein Weg Kopieren Sie den folgenden Code in die IDE, schalten Sie die Quelldatei Kodierung UTF-16 und hier gehen wir.

public class HelloWorld {

    public static void main(String[] args) {

        HelloWorld.nеw();
    }

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

}

Dieser Code ist eine wohlgeformte und gültige Java-Klasse. wie Sie es haben jedoch erraten ist ein kleiner Trick:. die ‚е‘ Zeichen in „neue“ Kennung zu dem ASCII-Zeichensatz gehört nicht, es ist eigentlich ein Kyrillisch ‚е‘ (prounanced ‚YE‘)

Aktuelle Java-Spezifikation erlaubt ausdrücklich, und dies ein wichtiger Punkt zu machen, ist die Verwendung von Unicode für Bezeichner benennen. Das bedeutet, dass man die Fähigkeit hat, sich frei seine oder ihre Klassen in Französisch, Chinise oder Russisch anrufen, wenn sie dies wünschen. Es ist auch möglich, zu mischen und die Alphabete innerhalb Code übereinstimmen. Und historisch gesehen, einige Buchstaben in Latein und anderen Alphabeten sind lookalikes.

Als Ergebnis: Nein, Sie können nicht die reservierten Worte als Bezeichner verwenden, aber Sie können Bezeichner verwenden, die genau wie reservierte Worte aussehen.

Ob jemand sein sollte, tut es eine ganz andere Sache ist.

Nein, Sie können das nicht. Für weitere Informationen gehen Sie bitte href="http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.9" rel="noreferrer"> JLS Abschnitte 3.8, 3.9

  

Die folgenden Zeichenfolgen,   aus ASCII-Buchstaben gebildet werden, sind   reserviert für die Verwendung als Schlüsselwörter und   kann nicht als Bezeichner verwendet werden (§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

Ja, es gibt. Sie müssen reservierte Wörter aus der Zukunft verwenden. Wie, was passierte mit verschiedenen Methoden genannt assert () in pre-1.4-Code.

Hoffe, es hilft!

Hä? Warum würden Sie das tun wollen? Sie können sie in l33t schreiben, dass der Compiler wird täuschen.

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

Ich weiß, es alte Frage ist immer noch, könnte jemand helfen.

Es ist möglich, durch die Verwendung Gson Feld Naming Unterstützung

zB.

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

Es ist schlimm genug, einige case-sensitive Sprachen erlauben Dinge wie folgt aus:

class New;

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

Aber warum sollten Sie jemals in der Lage sein wollen, eine einzige Zeile Code wie folgt zu schreiben:

class new;

class Something
{
    bool if;

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

Werfen Sie einen Blick auf die Syntaxhervorhebung. Auch wird es verwirrt!

Es gibt keine Möglichkeit, reservierte Worte mit dem javac zu verwenden Compiler.

Technisch können Sie die Namen in der Klassendatei bearbeiten, sobald es kompiliert , was Sie wollen sein: in diesem Stadium ist die VM nicht kümmern, weil es nicht ist mit dem Quellcode zu tun mehr . Ich glaube, einige obfuscators diese Technik verwenden.

PL / 1 (a 1960 IBM Mainframe-Programmiersprache noch um heute) eher berühmt erforderlich, dass einige Wörter wie Keywords in bestimmten Kontexten handeln, können alle Wörter als Bezeichner verwendet werden. Das ist nicht einmal so schwer in einem Parser zu tun, wenn Sie es konsequent festgelegt sein. PL / 1 wurde zu einem ziemlich großen Langauge betrachtet, und das Langauge Ausschuss besorgt, dass viele Programmierer würden alle davon nicht lernen, und dann überrascht erhalten würde, wenn sie versuchten, das Stichwort von einem Teil zu verwenden, sie als Kennung nicht wussten, . Also man Dinge schreiben könnte wie:

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

Wie andere haben hier erwähnt, ist die Fähigkeit, dies zu tun, ist keine Empfehlung.

Die Java-Designer entschieden, die Anzahl der Keywords in dem Langauge war bescheiden, und die Menge vorbehalten. Sie haben sogar reserviert ‚GOTO‘, die nicht wirklich in jedem realen Java-Programm erlaubt ist.

Nicht sicher, was Sie zu tun versuchen, ist aber $ ein gültiges Zeichen in Bezeichnern, so tun Sie könnten sagen:

int $return = 5;

Es sieht ein wenig seltsam, aber es funktioniert.

In Scala können Sie verwenden Backticks. Zum Beispiel: myVarialbe.`class`

Wenn Sie wirklich ein Feld / lokaler Variable / Methode, um das gleiche wie ein reserviertes Wort namens verwenden müssen, schlage ich vor, einen Unterstrich am Ende des Namen angehängt:

// JPA entity mapping class:

private Boolean void_;

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

Es ist eine lesbare Wahl (IMHO) als Zeichen am Anfang des Namen angehängt (fVoid, avoid, vVoid usw.)

Der obige Code ist eine reale Welt Fall, dass mir passiert ist, mit einem Legacy-Datenbank arbeiten, in dem die invoice Tabelle ein Feld namens void hatte der angibt, ob das Dokument für ungültig erklärt worden war oder nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top