Keywords: Unterschied zwischen den Versionen

Aus MimiPedia
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
Zeile 1: Zeile 1:
[[Category:Java]]
[[Category:Java]]
Unter einem Keyword vesteht man eine Zeichenfolge, die in Java nur mit ganz bestimmter Bedeutung eingesetzt werden darf.
__TOC__
So darf das {{java|if}} ausschließlich verwendet werden um ein Konstrukt zur Bedingten Ausführung einzuleiten.
== Was ist ein Keyword? ==
Nicht aber als bezeichner, auch nicht als Teil eines package-Namens.
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 keyword hinzu:
== 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 brachte mit dem einzelnen Underscore {{java|_}} das 51te und bislang letzte keyword hinzu.
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 keywords liegt an der unvermeidlichen Kompilier-Fehlern die beim Update entstehen,
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.
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";
var x = "fünf";
}}  
}}  
die Variable ''x'' mit dem Typ ''String''.
eine Variable mit dem Bezeichner {{java|x}} und dem Typ {{java|String}}.


{{java|var}} kann aber weiterhin als Bezeichner genutzt werden. Zumindest der Compiler hat nichts gegen diese Deklaration:
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:
  }
  }
}}
}}
Als Typ-Identifier hingegen ist "var" nicht erlaubt.
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 17 wurde in der Java-Spec ein neuer Begriff geprägt: das Contextual Keyword. Die Spec listet 16 solcher Sequenzen auf:
Mit Java 9 wurden die Sequenzen
  exports      opens     requires     uses
  open        module     requires    transitive  exports
module      permits   sealed      var
  opens        to          uses        provides     with
  non-sealed  provides   to          with
im Rahmen von Project "Jigsaw" eingeführt, das neue Java-Modul-Konzept. Die Spec bezeichnet sie als ''Restricted Keywords''.
open        record    transitive  yield
Mit Ausnahme von {{java|non-sealed}} sind die contextual keywords als Bezeichner -- etwa für Varaiblen oder Klassen -- verwendbar.


Die Sequenzen {{java|true}}, {{java|false}} und {{java|null}} sind im übrigen ''keine'' keywords -- auch keine Kontext-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:
sondern Literale, also Bezeichner für Konstanten.
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.