Konstanten (Java): Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
K (ABER)
Zeile 77: Zeile 77:
 
</code=java>
 
</code=java>
  
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 !
+
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 [https://www.java-blog-buch.de/0605-enumerations/ enums], also Aufzählungen, verwenden.
Eine häufie 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>
 
<code=java>
Zeile 90: Zeile 91:
 
</code=java>
 
</code=java>
  
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>
 
<code=java>
 
private static final String[] TEST = {"Test", "Test2"};
 
private static final String[] TEST = {"Test", "Test2"};

Version vom 28. Januar 2018, 15:47 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: <code=java> 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)); </code=java>


Hier werden aber drei Font Objekte initialisiert obwohl sie identisch sind. Mit der Definition einer Konstanten wird das ganze performanter und auch übersichtlicher: <code=java> private static final Font LABEL_FONT = new Font("Dialog", Font.BOLD, 12); ... JLabel label = new JLabel("Name: "); label.setFont(LABEL_FONT); .... </code=java>


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

<code=java> public class TestClass {

 public static final String CONFIGURATION_FILE = "config.xml";
 private static final int NUMBER_OF_LINES_TO_READ = 10;

..... } </code=java>


static "Konstruktor"

<code=java> 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");
 }

} </code=java>

ABER

Es kommt manchmal vor, dass man ein Interface als "Konstantenlager" missbraucht: <code=java> 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);
   }

} </code=java>

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!

<code=java> 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

} </code=java>

Um dem entgegen zu gehen, niemals einen konstanten Array verwenden, sondern ihn in eine unmodifizierbare Liste umwandeln: <code=java> 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

} </code=java>

-- bygones 30.06.2004