Reservierte Wörter als Namen oder Bezeichner
Ist es eine schwierige Art und Weise zu verwenden, Java reservierte Wörter als variable, Methode, Klasse, interface, Paket, oder enum-Konstanten-Namen?
- nur tun Sie es nicht
- Es ist nicht so seltsam, dass er will das tun. Deshalb hat C# eine @ - Präfix, und Delphi hat & und die variable oder Methode mit dem Namen zB. @wenn legal ist in C#.
- Ich bekomme nicht alle die "nicht" - Kommentare. Es ist durchaus legitim zu nennen-APIs von Java, die nicht selbst in Java geschrieben, und es sind Kennungen, die sind völlig legal in der JVM-byte-code, die sind nicht legal in Java. Das ist genau, warum Sprachen wie C# (
@class
), Scala (`class`
) und andere haben die Flucht-Mechanismen. Es gibt 500 Sprachen auf der JVM, wenn ich versuchte, jedes einzelne reserviertes Wort von jedem einzelnen eins von diesen 500 Sprachen und berücksichtigen bei der Gestaltung von APIs, ich würde verrückt gehen (und könnte jemand erfinden eine neue Sprache mit einem neuen reserviertes Wort später sowieso).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, es gibt keinen Weg. Das ist, warum Sie mit der Bezeichnung "reserviert".
Dies ist eine berechtigte Frage. So ein Ding ist möglich in anderen Sprachen. In C#, Präfix des Bezeichners mit
@
(als gefragt, vor); in Delphi, Präfix mit&
. Aber Java bietet keine solche Funktion (teilweise, weil Sie nicht wirklich brauchen, um die Interaktion mit Bezeichner definiert die von anderen Sprachen den Weg die .Net-Welt tut).Meisten oft diese Frage kommt für "Klasse", in diesem Fall ist es üblich zu schreiben "clazz".
Streng genommen kann man nicht, es sei denn, Sie bekommen Ihre Hände auf einen buggy compiler-Implementierung, die nicht haften, um die Sprache Java spec.
Aber wo ein Wille ist, ist auch ein Weg. Kopieren Sie den folgenden code in Ihrer IDE, wechseln Sie die Quelle der Datei-Kodierung UTF-16-und hier gehen wir:
Dieser code ist eine wohlgeformte und gültige Java-Klasse. Jedoch, wie Sie schon erraten haben, gibt es einen kleinen trick: die 'е' - Zeichen in "neue" Bezeichner gehören nicht zum ASCII-Zeichensatz, es ist tatsächlich ein cyrrilic 'е' (prounanced 'IHR').
Aktuelle Java-language-Spezifikation explizit erlaubt, und dieses ist ein wichtiger Punkt zu machen, ist die Verwendung von Unicode für die Benennung von Bezeichnern. Das bedeutet, dass man eine Fähigkeit hat, frei zu nennen, Ihre oder seine Kurse in Französisch, Chinise oder Russisch, wenn Sie wollen. Es ist auch möglich, zu mischen und entsprechen Sie die Alphabete innerhalb von code. Und historisch gesehen, einige Briefe in Latein und anderen Alphabeten sind lookalikes.
Als Ergebnis: Nein, können Sie nicht verwenden, die reservierte Wörter als Bezeichner, sondern Sie können Bezeichner verwenden, die genauso Aussehen wie reservierte Wörter.
Ob jemand sein sollte, es zu tun ist eine ganz andere Sache.
Nein, Sie können das nicht tun. Für weitere Informationen gehen Sie bitte zu JLS Abschnitte 3.8, 3.9
Ja, es ist.
Sie haben die Verwendung von reservierten Wörtern aus der Zukunft.
Wie was geschah mit verschiedenen Methoden namens assert() in pre-1.4-code.
Hoffe, es hilft!
Nicht wahr? Warum wollen Sie das tun? Sie können schreiben Sie Sie in l33t,, der Narr der compiler.
Ich weiß, es ist eine alte Frage noch, könnte jemand helfen.
Ist es möglich mit Hilfe von GSON ist Feld Benennung Unterstützung
zB.
Es ist schlimm genug, dass einige groß-und Kleinschreibung Sprachen zulassen, dass Dinge wie die folgenden:
Aber warum würde Sie jemals in der Lage sein möchten, schreiben eine Zeile code wie diese:
Werfen Sie einen Blick auf die syntax-Hervorhebung. Auch kommt er Durcheinander!
clazz
oderklass
verwendet wird).default
. Dies funktioniert perfekt in Ordnung, dadefault
ist nicht ein reserviertes Schlüsselwort in Scala. Es ist jedoch ein reserviertes Wort in Java, daher können Sie diese Methode aufrufen von Java, obwohl Sie vollkommen legitim Grund, dies zu tun.Gibt es keine Möglichkeit, reservierte Wörter, die mit der javac compiler.
Technisch, können Sie Bearbeiten Sie den Namen innerhalb der class-Datei, sobald es kompiliert zu werden, was Sie wollen: in diesem Stadium kann der VM sich nicht kümmern, denn es ist nicht der Umgang mit source-code nicht mehr. Ich glaube, dass einige obfuscators, diese Technik zu verwenden.
PL/1 (ein 1960er-Jahren von IBM mainframe Programmiersprache immer noch rund, heute), sondern bekanntlich erforderlich, dass, während einige Worte wirken wie keywords in bestimmten Kontexten, alle Wörter als Bezeichner verwendet werden können. Das ist nicht einmal schwer zu tun in einem parser wenn Sie sich konsequent daran. PL/1 wurde als eine ziemlich große Sprache, und die Sprache Ausschuss besorgt darüber, dass viele Programmierer würden nicht alles erfahren, und dann würde Sie bekommen überrascht, wenn Sie versucht, verwenden Sie das Schlüsselwort aus einem Teil, Sie wusste nicht, wie eine Kennung.
So könnten Sie schreiben Dinge wie:
Wie andere schon hier erwähnt, die Fähigkeit zu tun, das ist nicht eine Empfehlung.
Die Java-Designer haben beschlossen, die Anzahl der keywords in der Sprache war bescheiden und zurückhaltend eingestellt. Sie selbst vorbehalten 'GOTO', das ist eigentlich nicht erlaubt in jedem echten Java-Programm.
Nicht sicher, was Sie versuchen zu tun, aber $ ist ein gültiges Zeichen in Bezeichnern, so dass Sie könnte tun, zu sagen:
int $return = 5;
Sieht es ein wenig seltsam, aber es funktioniert.
In Scala können Sie backticks. Zum Beispiel: myVarialbe.`class`
Wenn Sie wirklich brauchen, um ein Feld verwenden/lokale variable/Methode den gleichen Namen wie ein reserviertes Wort ist, schlage ich vor, anfügen ein Unterstrich am Ende des namens:
Es ist ein lesenswerter Wahl (IMHO) als das Anhängen chars am Anfang des namens (fVoid, vermeiden, vVoid, etc.)
Den code oben ist ein realer Fall, der mir passiert ist, Sie arbeiten mit einer bestehenden Datenbank, in der die
invoice
Tabelle ein Feld mit dem Namenvoid
angibt, ob das Dokument hatten, wurden für ungültig erklärt oder nicht.