Reservierte Wörter wie Namen oder Bezeichner
-
05-07-2019 - |
Frage
Gibt es eine komplizierte Weise Java zu verwenden Worte wie Variable reserviert, Methode, Klasse, Schnittstelle, Paket, oder Enum konstante Namen?
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.