Keywords: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
Zeile 1: | Zeile 1: | ||
[[Category:Java]] | [[Category:Java]] | ||
Unter einem Keyword vesteht man eine Zeichenfolge, die | __TOC__ | ||
So darf das {{java|if}} ausschließlich verwendet werden um ein Konstrukt zur | == Was ist ein Keyword? == | ||
Unter einem Keyword vesteht man in einer Programmiersprache eine Zeichenfolge, die nur mit ganz bestimmter Bedeutung eingesetzt werden darf. | |||
So darf das {{java|if}} ausschließlich verwendet werden um ein Konstrukt zur bedingten Ausführung einzuleiten; nicht aber als Bezeichner, | |||
auch nicht als Teil eines package-Namens. | |||
Mit Java 5 kam {{java|enum}} als 50tes | == Java Keywords == | ||
Mit Java 5 kam {{java|enum}} als 50tes Keyword hinzu: | |||
abstract continue for new switch | abstract continue for new switch | ||
assert default if package synchronized | assert default if package synchronized | ||
Zeile 15: | Zeile 18: | ||
class finally long strictfp volatile | class finally long strictfp volatile | ||
const float native super while | const float native super while | ||
Java 9 | In Java 9 kam mit dem einzelnen Underscore {{java|_}} das 51te und bislang letzte Keyword hinzu. | ||
Der Grund für die sparsame Einführung neuer | Der Grund für die sparsame Einführung neuer Keywords liegt an den unvermeidlichen Kompilier-Fehlern die beim Update entstehen, | ||
wenn das -- bis dahin erlaubte -- | wenn das -- bis dahin erlaubte -- Keyword bona fide verwendet wurde. Das ist durchaus problematisch, da die gestörte Abwärts-Komaptibilität | ||
zu erhöhtem Aufwand und zu Verzögerungen beim Update führt. | |||
Da aber eine Spracherweiterung nur möglich ist, wenn neue Konstrukte eindeutig identifzierbar sind, wurde ein alternativer Weg gefunden. | Da aber eine strukturelle Spracherweiterung nur möglich ist, wenn neue Konstrukte eindeutig identifzierbar sind, | ||
wurde ein alternativer Weg gefunden der die Abwärts-Kompatibilität nicht gefährdet. | |||
== Contextual Keywords == | |||
Die Sequenz {{java|var}} wurde in Java 11 eingeführt um Varaiblen deklarieren zu können, deren Typ der Compiler aus dem Kontext bestimmt. | Die Sequenz {{java|var}} wurde in Java 11 eingeführt um Varaiblen deklarieren zu können, deren Typ der Compiler aus dem Kontext bestimmt. | ||
So definiert der Ausdruck | So definiert etwa der Ausdruck | ||
{{java|code= | {{java|code= | ||
var x = "fünf"; | |||
}} | }} | ||
eine Variable mit dem Bezeichner {{java|x}} und dem Typ {{java|String}}. | |||
{{java|var}} | Im Gegensazu zu den Keywords kann {{java|var}} aber weiterhin als Bezeichner genutzt werden. Zumindest der Compiler hat nichts gegen diese Deklaration: | ||
{{java|code= | {{java|code= | ||
class Var { | class Var { | ||
Zeile 38: | Zeile 44: | ||
} | } | ||
}} | }} | ||
Einzige Einschränkung ist, daß {{java|var}} nicht als Typ-Identifier erlaubt ist, was aber nicht geschieht wenn sich der Coder an die "Sun"-Code-Convention hält. | |||
Mit Java | Mit Java 9 wurden die Sequenzen | ||
open module requires transitive exports | |||
opens to uses provides with | |||
im Rahmen von Project "Jigsaw" eingeführt, das neue Java-Modul-Konzept. Die Spec bezeichnet sie als ''Restricted Keywords''. | |||
Erst mit Java 17 wurde in der Java-Spec dafür der Begriff ''Contextual Keyword'' geprägt. Java 17 führten die folgenden sequenzen ein: | |||
permits sealed non-sealed record yield | |||
Mit Ausnahme von {{java|non-sealed}} sind alle Contextual Keywords als Bezeichner -- etwa für Variablen -- verwendbar. | |||
== Ungenutzte Keywords == | |||
In der Liste der echten Keywords fallen einige auf, die in der normalen Programmierung nicht auftauchen: | |||
'''const''' und '''goto''' wurden in der ersten Java-Spezifikation definiert, aber niemals mit einer Semantik versehen. | |||
Sie können nicht verwendet werden und würden auch nichts tun wenn man es könnte. | |||
'''_''' (der Underscore) wurde präventiv eingeführt, hat auch in Java 21 noch keine Bedeutung erhalten. | |||
Er wird vermutlich im Zusammenhang mit dem type pattern matching einmal Bedeutung erhalten. | |||
== Nicht-Keywords == | |||
Obwohl man das vermuten könnte, sind die Sequenzen {{java|true}}, {{java|false}} und {{java|null}} ''keine'' Keywords -- auch keine Kontext-Keywords. | |||
Tatsächlich handelt sich bei allen drei um Literale, also Sequenzen die Konstanten definieren. | |||
Dadurch verhalten sich die drei ähnlich wie Keywords, sie können nicht als Bezeichner verwendet werden, auch nicht als Teil eines Package-Bezeichners. |
Aktuelle Version vom 21. Oktober 2023, 15:11 Uhr
Was ist ein Keyword?
Unter einem Keyword vesteht man in einer Programmiersprache eine Zeichenfolge, die nur mit ganz bestimmter Bedeutung eingesetzt werden darf.
So darf das if
ausschließlich verwendet werden um ein Konstrukt zur bedingten Ausführung einzuleiten; nicht aber als Bezeichner,
auch nicht als Teil eines package-Namens.
Java Keywords
Mit Java 5 kam enum
als 50tes Keyword hinzu:
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
In Java 9 kam mit dem einzelnen Underscore _
das 51te und bislang letzte Keyword hinzu.
Der Grund für die sparsame Einführung neuer Keywords liegt an den unvermeidlichen Kompilier-Fehlern die beim Update entstehen, wenn das -- bis dahin erlaubte -- Keyword bona fide verwendet wurde. Das ist durchaus problematisch, da die gestörte Abwärts-Komaptibilität zu erhöhtem Aufwand und zu Verzögerungen beim Update führt.
Da aber eine strukturelle Spracherweiterung nur möglich ist, wenn neue Konstrukte eindeutig identifzierbar sind, wurde ein alternativer Weg gefunden der die Abwärts-Kompatibilität nicht gefährdet.
Contextual Keywords
Die Sequenz var
wurde in Java 11 eingeführt um Varaiblen deklarieren zu können, deren Typ der Compiler aus dem Kontext bestimmt.
So definiert etwa der Ausdruck
var x = "fünf";
eine Variable mit dem Bezeichner x
und dem Typ String
.
Im Gegensazu zu den Keywords kann var
aber weiterhin als Bezeichner genutzt werden. Zumindest der Compiler hat nichts gegen diese Deklaration:
class Var { static int var = 5; { var var = Var.var; } }
Einzige Einschränkung ist, daß var
nicht als Typ-Identifier erlaubt ist, was aber nicht geschieht wenn sich der Coder an die "Sun"-Code-Convention hält.
Mit Java 9 wurden die Sequenzen
open module requires transitive exports opens to uses provides with
im Rahmen von Project "Jigsaw" eingeführt, das neue Java-Modul-Konzept. Die Spec bezeichnet sie als Restricted Keywords.
Erst mit Java 17 wurde in der Java-Spec dafür der Begriff Contextual Keyword geprägt. Java 17 führten die folgenden sequenzen ein:
permits sealed non-sealed record yield
Mit Ausnahme von non-sealed
sind alle Contextual Keywords als Bezeichner -- etwa für Variablen -- verwendbar.
Ungenutzte Keywords
In der Liste der echten Keywords fallen einige auf, die in der normalen Programmierung nicht auftauchen:
const und goto wurden in der ersten Java-Spezifikation definiert, aber niemals mit einer Semantik versehen. Sie können nicht verwendet werden und würden auch nichts tun wenn man es könnte.
_ (der Underscore) wurde präventiv eingeführt, hat auch in Java 21 noch keine Bedeutung erhalten. Er wird vermutlich im Zusammenhang mit dem type pattern matching einmal Bedeutung erhalten.
Nicht-Keywords
Obwohl man das vermuten könnte, sind die Sequenzen true
, false
und null
keine Keywords -- auch keine Kontext-Keywords.
Tatsächlich handelt sich bei allen drei um Literale, also Sequenzen die Konstanten definieren.
Dadurch verhalten sich die drei ähnlich wie Keywords, sie können nicht als Bezeichner verwendet werden, auch nicht als Teil eines Package-Bezeichners.