Konstanten (Java)
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 ! Eine häufie 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>