Konstanten (Java): Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
K (ABER)
K
 
(2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
Konstanten sind Variablen die nach einmaligem Initialisieren nicht verändert werden können. Sie dienen dazu, dass man oft verwendete Variablen nicht unnötig mehrfach deklariert.
+
__TOC__
 +
 
 +
Konstanten sind [[Variable|Variablen]] die nach einmaligem Initialisieren nicht verändert werden können. Sie dienen dazu, dass man oft verwendete Variablen nicht unnötig mehrfach deklariert.
  
 
Wenn man z.b. für seine GUI eine bestimmte Schriftart verwenden will könnte man folgendes machen:
 
Wenn man z.b. für seine GUI eine bestimmte Schriftart verwenden will könnte man folgendes machen:
<code=java>
+
<syntaxhighlight lang="java">
 
JLabel label = new JLabel("Name: ");
 
JLabel label = new JLabel("Name: ");
 
label.setFont(new Font("Dialog", Font.BOLD, 12));
 
label.setFont(new Font("Dialog", Font.BOLD, 12));
Zeile 11: Zeile 13:
 
label = new JLabel("Telefon: ");
 
label = new JLabel("Telefon: ");
 
label.setFont(new Font("Dialog", Font.BOLD, 12));
 
label.setFont(new Font("Dialog", Font.BOLD, 12));
</code=java>
+
</syntaxhighlight>
  
  
Hier werden aber drei Font Objekte initialisiert obwohl sie identisch sind.
+
Hier werden aber drei Font [[Objekt|Objekte]] initialisiert obwohl sie identisch sind.
Mit der Definition einer Konstanten wird das ganze performanter und auch übersichtlicher:
+
Mit der [[Definition]] einer Konstanten wird das ganze performanter und auch übersichtlicher:
<code=java>
+
<syntaxhighlight lang="java">
 
private static final Font LABEL_FONT = new Font("Dialog", Font.BOLD, 12);
 
private static final Font LABEL_FONT = new Font("Dialog", Font.BOLD, 12);
 
...
 
...
Zeile 22: Zeile 24:
 
label.setFont(LABEL_FONT);
 
label.setFont(LABEL_FONT);
 
....
 
....
</code=java>
+
</syntaxhighlight>
  
  
 
Das hat auch den Vorteil, dass wenn man die Schrift ändern will man nur die Konstante ändern muss und nicht alle Stellen im Code nach der Schrift suchen muss.
 
Das hat auch den Vorteil, dass wenn man die Schrift ändern will man nur die Konstante ändern muss und nicht alle Stellen im Code nach der Schrift suchen muss.
  
Konstante zeichnen sich v.a. durch die Deklaration static final aus, d.h. durch das static sind sie nicht an eine Instanz gebunden und das final markiert, dass sie nicht mehr veränderbar sind. Des Weiteren gilt als Konvention dass man sie komplett in Großbuchstaben schreibt, um sie von den anderen nicht - konstanten Variablen unterscheiden zu können. Besteht eine Konstante aus mehreren Wörtern, so verbindet man sie mit dem Underscore Zeichen '_'.
+
Konstante zeichnen sich v.a. durch die [[Deklaration]] <code>static final</code> aus, d.h. durch das <code>static</code> sind sie nicht an eine [[Instanz]] gebunden und das <code>final</code> markiert, dass sie nicht mehr veränderbar sind. Des Weiteren gilt als Konvention dass man sie komplett in Großbuchstaben schreibt, um sie von den anderen nicht - konstanten Variablen unterscheiden zu können. Besteht eine Konstante aus mehreren Wörtern, so verbindet man sie mit dem Underscore Zeichen '_'.
Im Gegensatz zu normalen Variablen können Konstanten als public Variablen definiert werden, wenn sie Informationen beinhaltet, die für mehrere Klassen gültig ist (dennoch sollte der Gebrauch dieser Art von Konstanten minimiert werden).
+
Im Gegensatz zu normalen Variablen können Konstanten als public Variablen definiert werden, wenn sie Informationen beinhaltet, die für mehrere [[Klasse|Klassen]] gültig ist (dennoch sollte der Gebrauch dieser Art von Konstanten minimiert werden).
  
 
Um eine Konstante zu definieren gibt es zwei Möglichkeiten:
 
Um eine Konstante zu definieren gibt es zwei Möglichkeiten:
  
 
== Sofort initialisieren ==
 
== Sofort initialisieren ==
<code=java>
+
<syntaxhighlight lang="java">
 
public class TestClass {
 
public class TestClass {
 
   public static final String CONFIGURATION_FILE = "config.xml";
 
   public static final String CONFIGURATION_FILE = "config.xml";
Zeile 39: Zeile 41:
 
.....
 
.....
 
}
 
}
</code=java>
+
</syntaxhighlight>
  
  
 
== static "Konstruktor" ==
 
== static "Konstruktor" ==
<code=java>
+
<syntaxhighlight lang="java">
 
public class TestClass{
 
public class TestClass{
 
   private static final String PROP_FILE = "prop.properties";
 
   private static final String PROP_FILE = "prop.properties";
Zeile 60: Zeile 62:
 
   }
 
   }
 
}
 
}
</code=java>
+
</syntaxhighlight>
  
 
= ABER =
 
= ABER =
 
Es kommt manchmal vor, dass man ein Interface als "Konstantenlager" missbraucht:
 
Es kommt manchmal vor, dass man ein Interface als "Konstantenlager" missbraucht:
<code=java>
+
<syntaxhighlight lang="java">
 
interface Constants {
 
interface Constants {
 
     public String CONFIG_FILE = "config.xml";
 
     public String CONFIG_FILE = "config.xml";
Zeile 75: Zeile 77:
 
     }
 
     }
 
}
 
}
</code=java>
+
</syntaxhighlight>
  
Das ist zwar recht angenehm, da man die Variable einfach in versch. Klassen verwenden kann. Aber es widerspricht komplett dem Sinn eines Interfaces und sollte daher nicht gemacht werden! Stattdessen sollte man [[enum|enums]], also Aufzählungen, verwenden.
+
Das ist zwar recht angenehm, da man die Variable einfach in versch. [[Klasse|Klassen]] verwenden kann. Aber es widerspricht komplett dem Sinn eines [[Interface_Java()|Interfaces]] und sollte daher nicht gemacht werden! Stattdessen sollte man [[enum|enums]], also Aufzählungen, verwenden.
  
  Eine häufige Stolperstelle ist ein konstanter Array, da man dessen Elemente ändern kann!
+
  Eine häufige Stolperstelle ist ein konstanter [[Array]], da man dessen Elemente ändern kann!
  
<code=java>
+
<syntaxhighlight lang="java">
 
private static final String[] TEST = {"Test", "Test2"};
 
private static final String[] TEST = {"Test", "Test2"};
  
Zeile 89: Zeile 91:
 
     System.out.println(TEST[0]); // gibt "HAHA" aus
 
     System.out.println(TEST[0]); // gibt "HAHA" aus
 
}
 
}
</code=java>
+
</syntaxhighlight>
  
 
Um dem entgegen zu gehen, niemals einen konstanten Array verwenden, sondern ihn in eine unmodifizierbare Liste umwandeln:
 
Um dem entgegen zu gehen, niemals einen konstanten Array verwenden, sondern ihn in eine unmodifizierbare Liste umwandeln:
<code=java>
+
<syntaxhighlight lang="java">
 
private static final String[] TEST = {"Test", "Test2"};
 
private static final String[] TEST = {"Test", "Test2"};
  
Zeile 100: Zeile 102:
 
   TEST_LIST.set(0, "HAHA"); // wirft eine UnsupportedOperationException, keine Änderung möglich
 
   TEST_LIST.set(0, "HAHA"); // wirft eine UnsupportedOperationException, keine Änderung möglich
 
}
 
}
</code=java>
+
</syntaxhighlight>
 +
 
 +
{{Fragen stellen}}
 +
 
 +
 
  
[[Kategorie:Java]]
+
[[Kategorie:Tutorials (Java)]]
 
[[Kategorie:Java Grundlagen]]
 
[[Kategorie:Java Grundlagen]]
  
 
--[[Benutzer:bygones | bygones]] 30.06.2004
 
--[[Benutzer:bygones | bygones]] 30.06.2004

Aktuelle Version vom 8. April 2018, 12:02 Uhr

Konstanten sind Variablen die nach einmaligem Initialisieren nicht verändert werden können. Sie dienen dazu, dass man oft verwendete Variablen nicht unnötig mehrfach deklariert.

Wenn man z.b. für seine GUI eine bestimmte Schriftart verwenden will könnte man folgendes machen:

JLabel label = new JLabel("Name: ");
label.setFont(new Font("Dialog", Font.BOLD, 12));
....
label = new JLabel("Adresse: ");
label.setFont(new Font("Dialog", Font.BOLD, 12));
...
label = new JLabel("Telefon: ");
label.setFont(new Font("Dialog", Font.BOLD, 12));


Hier werden aber drei Font Objekte initialisiert obwohl sie identisch sind. Mit der Definition einer Konstanten wird das ganze performanter und auch übersichtlicher:

private static final Font LABEL_FONT = new Font("Dialog", Font.BOLD, 12);
...
JLabel label = new JLabel("Name: ");
label.setFont(LABEL_FONT);
....


Das hat auch den Vorteil, dass wenn man die Schrift ändern will man nur die Konstante ändern muss und nicht alle Stellen im Code nach der Schrift suchen muss.

Konstante zeichnen sich v.a. durch die Deklaration static final aus, d.h. durch das static sind sie nicht an eine Instanz gebunden und das final markiert, dass sie nicht mehr veränderbar sind. Des Weiteren gilt als Konvention dass man sie komplett in Großbuchstaben schreibt, um sie von den anderen nicht - konstanten Variablen unterscheiden zu können. Besteht eine Konstante aus mehreren Wörtern, so verbindet man sie mit dem Underscore Zeichen '_'. Im Gegensatz zu normalen Variablen können Konstanten als public Variablen definiert werden, wenn sie Informationen beinhaltet, die für mehrere Klassen gültig ist (dennoch sollte der Gebrauch dieser Art von Konstanten minimiert werden).

Um eine Konstante zu definieren gibt es zwei Möglichkeiten:

Sofort initialisieren

public class TestClass {
  public static final String CONFIGURATION_FILE = "config.xml";
  private static final int NUMBER_OF_LINES_TO_READ = 10;
.....
}


static "Konstruktor"

public class TestClass{
  private static final String PROP_FILE = "prop.properties";

  public static final String CONFIG_FILE;
  public static final String PROJECT_NAME;

  static {
    // hier könnte man z.b. nun ein File einlesen in dem die
    // Werte für die Konstanten stehen
    Properties prop = new Properties();
    prop.load(new FileInputStream(PROP_FILE));
   
    CONFIG_FILE = prop.getProperty("configFile");
    PROJECT_NAME = prop.getProperty("projectName");
  }
}

ABER

Es kommt manchmal vor, dass man ein Interface als "Konstantenlager" missbraucht:

interface Constants {
    public String CONFIG_FILE = "config.xml";
    public int WHAT_EVER = 20;
}

public class setTest implements Constants{
    public static void main(String[] args) {
        System.out.print(CONFIG_FILE);
    }
}

Das ist zwar recht angenehm, da man die Variable einfach in versch. Klassen verwenden kann. Aber es widerspricht komplett dem Sinn eines Interfaces und sollte daher nicht gemacht werden! Stattdessen sollte man enums, also Aufzählungen, verwenden.

Eine häufige Stolperstelle ist ein konstanter Array, da man dessen Elemente ändern kann!
private static final String[] TEST = {"Test", "Test2"};

public static void main(String[] args) {
    System.out.println(TEST[0]); // gibt "Test" aus         
    TEST[0] = "HAHA";
    System.out.println(TEST[0]); // gibt "HAHA" aus
}

Um dem entgegen zu gehen, niemals einen konstanten Array verwenden, sondern ihn in eine unmodifizierbare Liste umwandeln:

private static final String[] TEST = {"Test", "Test2"};

public static final List TEST_LIST = Collections.unmodifiableList(Arrays.asList(TEST));

public static void main(String[] args) {
   TEST_LIST.set(0, "HAHA"); // wirft eine UnsupportedOperationException, keine Änderung möglich
}


Fragen

Das Thema wurde nicht ausreichend behandelt? Du hast Fragen dazu und brauchst weitere Informationen? Lass Dir von uns helfen!

Wir helfen dir gerne!


Dir hat dieser Artikel gefallen? Oder Du hast Fehler entdeckt und möchtest zur Berichtigung beitragen? Prima! Schreibe einen Kommentar!

Du musst angemeldet sein, um einen Kommentar abzugeben.

-- bygones 30.06.2004