Variablen Konstantensammlung vs. Enum

kaoZ

Top Contributor
Aloha, ich steh grade im Zwiespalt,

zzt. nutze ich zum handhaben von Festen Werten eine Konstantensammlung welche ich über einen Statischen Import anspreche

Java:
public class Constants {

	public final static String APP_TITLE = "Rechnungs Editor v1.0";
	
	public final static String MENUBAR_FILE 	= " Datei ";
	public final static String MENUBAR_EDIT 	= " Bearbeiten ";
	public final static String MENUBAR_OPTION 	= " Einstellungen ";
	public final static String MENUBAR_SEARCH 	= " Suchen ";
	public final static String MENUBAR_WINDOW 	= " Fenster ";
	public final static String MENUBAR_HELP 	= " Hilfe ";
	
	
	
	public final static int SCREEN_WIDTH = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
	public final static int SCREEN_HEIGHT = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
	
}

Jetzt habe ich allerdings gelesen ( Der Weg zum Java Profi - M.Inden ) das dies als unsauber bzw. weniger elegant ist, als ein Enum für Konstanten zu verwenden.

Java:
public enum Constant {
	
	APP_TITLE("Beispiel Applikation");
	
	private Constant(final String value){
		this.value = value;
	}
	
	final String value;

	public String getValue(){
		return this.value;
	}
	
}

einerseits könnte ich auf die Statischen Importe verzichten , andererseits muss ich dann folgendes in der Verwendung beachten

mit Konstanten :

Java:
JFrame frame = new JFrame(APP_TITLE);

mit Enum :

Java:
JFrame frame = new JFrame(Constant.APP_TITLE.getValue());

Schöner find ich vom Aufbau her aber irgendwie die Konstantensammlung , wie seht ihr das ?
 
Zuletzt bearbeitet:

Natac

Bekanntes Mitglied
Wenn es um Beschriftungen geht, würde ich die ResourceBundle-Api mit entsprechendem Aufruf verwenden. Das mit den Enums (+ ResourceBundle) habe ich mal in einem Projekt gemacht und fühlte sich für mich als Overhead an, da man immer nochmal die Enum-Konstante schreiben (anlegen + schlüssel mitgeben) und dann eben kompliziert aufrufen muss. Da finde ich ein
Code:
Resources.get("save");
irgendwie schöner.

Wenn es prinzipiell um Konstanten geht, dann nimm auf jeden fall die Klassen-Variante. Denn was ist, wenn du mal etwas anderes als einen String abspeichern willst? Gibts beim enum dann ein getInt()? Und wenn ja, was liefert getValue()? Und woher weißt du, bei welcher Enum-Konstante du das nehmen "darfst"? Da bist du mit der Constants-Klasse viel flexibler und typsicherer.

Ist aber nur meine Meinung. Vielleicht findet sich hier noch jemand mit mehr Erfahrung der dir das ganze besser als mit "fühlt sich für mich so und so an" begründen kann. ;)
 
Zuletzt bearbeitet:

turtle

Top Contributor
Du kannst die Enum-Variante so benutzen:
Java:
JFrame frame = new JFrame(APP_TITLE.value);

Und das finde ich aussagekräftig und würde es einer Konstantensammlung vorziehen.
 

kaoZ

Top Contributor
Zuerst einmal Danke,

Natac, das mit dem API werde ich mir mal anschauen .

Wie du auch schon sagtest halt ich eben den aufruf über Constants.APP_TITLE.getValue(); für ziemlichen Overkill, und stand dann gestern genau vor dem Problem wenn ich z.B die Werte für die Bildschirmgröße ermitteln wollte, dort wird nämlich als Wert ein Integer geliefert und kein String, so müsste ich dann wieder mehrere Sammlungen ( enums ) anlegen die jeweils die richtigen Werte liefern...

turtle, dein Beispiel gefällt mir vom Aufbau her sehr, das sieht Aussagekräftig und sinnvoll aus, allerdings komm ich grade nicht dahinter wie du das Umgesetzt hast das du den Klassennamen nicht angeben musst, wie soll der Compiler wissen in welcher Aufzählung er dann suchen soll ?

und wie müsste ich die Sammlung implementieren um diesen Aufruf zu ermöglichen ?

da ich ja den Qualifizierten Namen bisher immer angeben musst

sprich :
Code:
Constants.APP_TITLE
für die Sammlung und eben die öffentliche Methode
Code:
.getValue()
um an den zugewiesenen Wert zu gelangen .

Wenn du mir ein Beispiel geben könntest wäre ich sehr dankbar .
 

turtle

Top Contributor
Java:
import javax.swing.JFrame;

import static constant.ConstantEnum.*;

public class Turtle {

    public static void main(String[] args) {
	JFrame frame = new JFrame(APP_TITLE.value);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frame.setVisible(true);

    }
}

Java:
package constant;


public enum ConstantEnum {
    APP_TITLE("Beispiel Applikation");

    private ConstantEnum(final String value) {
	this.value = value;
    }

    public final String value;

}
 

kaoZ

Top Contributor
Ok funktioniert, allerdings auch nur in Verbindung mit einem Statischem Import,

die Frage ist , wenn ich wie oben schon beschrieben jetzt Anstelle eines Strings einen Integer benötige müsste ich dafür ja eine Separate Sammlung anlegen, oder ?

Und vorallem :

Warum soll das

Java:
JFrame frame = new JFrame(APP_TITLE.value);

sauberer Programmierstil sein als

Java:
JFrame frame = new JFrame(APP_TITLE);

mal abgesehen davon das die Aussage schon richtig ist das es sich ja bei Konstantensammlungen , eben um Sammlungen bzw. aufzählungen handelt, allerdings wird doch durch das nutzen verschiedenen Enums ( für Integer / Strings usw. usw.) die Anzahl an zugriffspunkten auch immens erhöht , ich meine wenn ich eine Klasse haben in welcher ich alle Konstanten definiere habe ich einen Zentralen Punkt an welchem ich dies tue, nutze ich Enums hab ich zwar vielleicht alles im gleichen Package aber in unterschiedlichen Sammlungen. ( dies wäre zwar der OO Ansatz, allerdings doch auch umständlicher oder ?.

Und soweit ich weiß soll man immer alle Dinge so einfach wie möglich halten um nicht unnötige Komplexität in die Implementierung zu bringen , insofern man davon keine nutzen hat ?!
 
Zuletzt bearbeitet:

turtle

Top Contributor
die Frage ist , wenn ich wie oben schon beschrieben jetzt Anstelle eines Strings einen Integer benötige müsste ich dafür ja eine Separate Sammlung anlegen, oder ?
Nein, das stimmt nicht. Siehe Beispiel.

Aber es ist natürlich immer eine Frage, was du eigentlich machen möchtest.

Java:
import javax.swing.JFrame;
import javax.swing.JOptionPane;

import static constant.ConstantEnum.*;

public class Turtle {

	public static void main(String[] args) {
		JFrame frame = new JFrame(APP_TITLE.value);
		JOptionPane.showConfirmDialog(null, APP_INTEGER.intValue);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);

	}
}
package constant;

Java:
public enum ConstantEnum {
	APP_TITLE("Beispiel Applikation"), APP_INTEGER(234);

	private ConstantEnum(final String value) {
		this.value = value;
	}

	private ConstantEnum(int value) {
		this.intValue = value;

	}

	public String value;
	public int intValue;

}
 

kaoZ

Top Contributor
Ich hatte vorhin schon versucht je einen Konstruktor für Strings und einen für Ínteger zu definieren , allerdings hat Eclipse mir sofort die Meldung ausgegeben das die Variablen nicht initialisiert wären..

ich hab eh noch nicht wirklich gecheckt warum ich in einem enum die Variablen nur nach dem Konstruktor definieren kann , und nicht wie in einer normalen klasse auch nach der Klassendeklaration, allerdings habe ich auch noch nicht sooooo oft mit enums gearbeitet, sondern mich eher auf die Implementierung mit Konstantensammlungen gestützt :)

Wäre super wenn du mir dies vielleicht auch fix erläutern könntest :)
 

shishigami

Mitglied
[...]
einerseits könnte ich auf die Statischen Importe verzichten , andererseits muss ich dann folgendes in der Verwendung beachten

mit Konstanten :

Java:
JFrame frame = new JFrame(APP_TITLE);

mit Enum :

Java:
JFrame frame = new JFrame(Constant.APP_TITLE.getValue());

Schöner find ich vom Aufbau her aber irgendwie die Konstantensammlung , wie seht ihr das ?

Statischer Import geht auch mit Enum, noch einen getter aufrufen zu müssen sehe ich nicht als allzu großes Problem.

Rein von der Struktur her halte ich Enums für sinnvoller als eine Klasse mit vielen Konstanten.

ich hab eh noch nicht wirklich gecheckt warum ich in einem enum die Variablen nur nach dem Konstruktor definieren kann , und nicht wie in einer normalen klasse auch nach der Klassendeklaration

Muss nicht nach dem Konstruktor sein:

Java:
public enum MyEnum {

    APP_TITLE("Beispiel");

    private final String value;

    private MyEnum(final String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public String toString() {
        return value;
    }

}

Die Variablen müssen nur nach den verschiedenen Enumerationen stehen. Auch das halte ich für sinnvoll.
 
Zuletzt bearbeitet:

Natac

Bekanntes Mitglied
Java:
public enum ConstantEnum {
	APP_TITLE("Beispiel Applikation"), APP_INTEGER(234);

	private ConstantEnum(final String value) {
		this.value = value;
	}

	private ConstantEnum(int value) {
		this.intValue = value;

	}

	public String value;
	public int intValue;

}
Und genau das ist der Grund, warum ich ein enum für eine schlechte Idee halte. Angenommen wir brauchen noch boolean und double, dann haben wir:

Java:
public String value;
public int intValue;
public int boolValue;
public int doubleValue;
Und woher weiß ich jetzt, bei welcher Constante ich welchen Wert verwenden muss? Weil
Code:
MY_CONST.inValue
klappt natürlich auch für eine Constante, die eigentlich einen double-Wert enthält. Und außer String werden alle Werte immer mit einem "gültigen" Wert gefüllt sein (0, 0.0, false).

Daher halte ich das Enum-Konzept in größeren Projekten für unübersichtlich und fehleranfällig. Natürlich könnte man jetzt pro Typ ein Enum definieren, die man alle statisch importieren könnte, was ich aber für Overkill halte.

Zudem emfpinde ich den Zugriff auf Attribute problematisch, weil sich die Werte evtl. zur Laufzeit ändern könnten (Sprache wird umgestellt). Würde als mindestens die Methode
Code:
val()
statt
Code:
value
einführen.

Prinzipiell gebe ich euch Recht, dass so ein enum etwas schönes ist, weil man auf Code-Ebene alle Werte fest vereinbart hat. Allerdings lassen sich damit Konstanten nur nach Typ und nicht nach Inhalt gruppieren, was ich schon als störend empfinde.

Dann lieber eine Constanten-Klasse mit statischen Methoden. Die kann ich genauso statisch importieren, bin vom Typ her aber flexibler. Enums sind zur Aufzählung von Gleichartigen Werten gedacht, was Konstanten in der Regel nun mal nicht sind (da unterschiedlichen Typs).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Enum oder normale Klasse? Java Basics - Anfänger-Themen 10
volcanos enum und switch (neu): falschen Wert mit IllegalArgumentException oder mit EnumConstantNotPresentException abfangen ? Java Basics - Anfänger-Themen 51
X Enum Abfrage ohne if, for, while oder switch Java Basics - Anfänger-Themen 21
U Warum kann ich die Methode in der ENUM Klasse nicht aufrufen? Und warum geht die Switch nicht? Java Basics - Anfänger-Themen 8
D Frage bzgl. Enum-Handhabung Java Basics - Anfänger-Themen 16
S Java Enum Java Basics - Anfänger-Themen 2
I Validation, ob String ein Wert aus einem Enum enthält Java Basics - Anfänger-Themen 3
V Enum Java Basics - Anfänger-Themen 1
C Farben als Enum Java Basics - Anfänger-Themen 3
N enum Attribut von Objekten einer Hashmap ausgeben Java Basics - Anfänger-Themen 6
I JAXB und Enum Java Basics - Anfänger-Themen 7
M Enum-Variable HashMap zuweisen Java Basics - Anfänger-Themen 5
B Enum innerhalb einer Klasse / anderes Konzept Java Basics - Anfänger-Themen 8
N Enum Typen, was passiert intern mit ihnen? Java Basics - Anfänger-Themen 2
A enum Java Basics - Anfänger-Themen 6
O Enum Array Rekursiv abarbeiten Java Basics - Anfänger-Themen 44
B ENUM to List<String> konvertieren Java Basics - Anfänger-Themen 2
N Java Enum converter Methode Java Basics - Anfänger-Themen 5
F Enum von Ländern Java Basics - Anfänger-Themen 8
J Klassen Enum als Informationsträger Java Basics - Anfänger-Themen 10
T Datentypen enum static Chaos (blutiger anfänger) Java Basics - Anfänger-Themen 5
R Enum ist das gleiche wie? Java Basics - Anfänger-Themen 15
P Klassen Richtige Anwendung einer Enum-Klasse Java Basics - Anfänger-Themen 11
E Datentypen Problem beim Speichern von enum. Java Basics - Anfänger-Themen 10
J Compiler-Fehler class interface or enum expected Java Basics - Anfänger-Themen 1
E Objektvergleich Enum Java Basics - Anfänger-Themen 7
kilopack15 Euromünzen in enum als Liste ausgeben Java Basics - Anfänger-Themen 11
N Enum als generischer Typ Java Basics - Anfänger-Themen 4
H Datentypen Fehler bei Verwendung von enum Java Basics - Anfänger-Themen 9
lBlKha0s Fehlermeldung : class interface or enum expected Java Basics - Anfänger-Themen 9
T error: class, interface, or enum expected Java Basics - Anfänger-Themen 5
S Menüauswahl per Enum Java Basics - Anfänger-Themen 12
F Enum via String definieren Java Basics - Anfänger-Themen 2
L Compiler-Fehler error: class, interface or enum expected Java Basics - Anfänger-Themen 2
M java.lang.Enum.valueOf(Unknown Source) Java Basics - Anfänger-Themen 2
M Enum-Variabel-Abfrage funktioniert nicht? Java Basics - Anfänger-Themen 2
P Fallunterscheidung mit Überprüfung (enum) Java Basics - Anfänger-Themen 11
H enum Type Java Basics - Anfänger-Themen 6
F Operatoren Enum aus Textdabei laden Java Basics - Anfänger-Themen 3
P enum: cannot be resolved to a type Java Basics - Anfänger-Themen 2
H Enum außerhalb einer Klasse? Java Basics - Anfänger-Themen 2
K OOP Aufzählungstypen! enum Currency!!! Java Basics - Anfänger-Themen 5
F ENUM als Variable Java Basics - Anfänger-Themen 4
M Enum: Zugriff auf Konstanten Java Basics - Anfänger-Themen 7
W Enum Konstruktor Type Java Basics - Anfänger-Themen 2
A Erste Schritte ENUM - Werte zurückgeben Java Basics - Anfänger-Themen 5
D Enum als Parameter Java Basics - Anfänger-Themen 6
B Variablen Instanz von Enum zur Laufzeit erstellen und zuweisen Java Basics - Anfänger-Themen 2
B Datentypen Enum vererben/gruppieren? Java Basics - Anfänger-Themen 6
F Datentypen enum Java Basics - Anfänger-Themen 5
J Enum zählen Java Basics - Anfänger-Themen 8
D Einlesen eines Enum-Wertes per console Java Basics - Anfänger-Themen 3
K String mit ENUM vergleichen? Java Basics - Anfänger-Themen 6
N enum vergleiche Klammern? Java Basics - Anfänger-Themen 5
J public enum? in Java Java Basics - Anfänger-Themen 9
D Erste Schritte Enum - das unbekannte Wesen Java Basics - Anfänger-Themen 3
Y ENUM auslesen (Name des ENUM als Variable) Java Basics - Anfänger-Themen 4
P Compiler-Fehler "class, interface, or enum expected" Java Basics - Anfänger-Themen 5
K class, interface or enum expected Java Basics - Anfänger-Themen 14
pg1337 enum-Aufgabe Java Basics - Anfänger-Themen 5
N was sagt enum aus? Java Basics - Anfänger-Themen 3
S Methoden Enum Parameter in Methode Java Basics - Anfänger-Themen 7
G Datentypen enum Frage Java Basics - Anfänger-Themen 3
R Probleme mit Enum Java Basics - Anfänger-Themen 10
B Enum: Instanzen Java Basics - Anfänger-Themen 10
B Generic? Enum - So lösbar? Java Basics - Anfänger-Themen 8
T class, interface, or enum expected Java Basics - Anfänger-Themen 2
M Vererbung Enum Vererbung/Polymorphie Java Basics - Anfänger-Themen 2
P Enum Attribut in Konstruktoren Java Basics - Anfänger-Themen 10
4 Enum Problem Java Basics - Anfänger-Themen 2
turmaline Bindestrich in enum? Java Basics - Anfänger-Themen 5
T Enum - Key als Value ermitteln Java Basics - Anfänger-Themen 7
X enum Fehlermeldung "The public type Day must be defined in its own file" Java Basics - Anfänger-Themen 8
T ist enum.ordinal keine Konstante? Java Basics - Anfänger-Themen 7
R State machine mit enum Java Basics - Anfänger-Themen 9
L enum aus Integer umwandeln Java Basics - Anfänger-Themen 3
C Klasseninstanzierung mit enum-Parameter erzwingen Java Basics - Anfänger-Themen 2
I Enum in String Java Basics - Anfänger-Themen 4
N enum richtig verwenden Java Basics - Anfänger-Themen 5
M for(Enum..., ButtonGroup.getElements()... Java Basics - Anfänger-Themen 3
StrikeTom Fragen zu enum Java Basics - Anfänger-Themen 4
A Was ist performanter für Konstanten, enum oder static variablen Java Basics - Anfänger-Themen 5
L String zu Enum parsen Java Basics - Anfänger-Themen 8
J Datentypen Array in enum, ?? Wozu ?? Java Basics - Anfänger-Themen 3
S OOP Durch ein Enum iterieren... Java Basics - Anfänger-Themen 47
K Datentypen enum und liste Java Basics - Anfänger-Themen 7
S String - Enum Java Basics - Anfänger-Themen 3
H Eine enum switchen? Java Basics - Anfänger-Themen 7
G enum für Typsicherheit Java Basics - Anfänger-Themen 9
J class, interface, or enum expected - finde Fehler nicht. Java Basics - Anfänger-Themen 4
J OOP enum Java Basics - Anfänger-Themen 2
O Problem (Enum) Java Basics - Anfänger-Themen 14
S Enum als Index Java Basics - Anfänger-Themen 5
H Enum --> int ?? Java Basics - Anfänger-Themen 3
tanja enum in java Java Basics - Anfänger-Themen 3
D class, interface or enum expected Java Basics - Anfänger-Themen 2
A OOP Übergabe eines Wertes an den enum Konstruktor Java Basics - Anfänger-Themen 12
T Simple Enum Fragen Java Basics - Anfänger-Themen 6
J class, interface, or enum expected Java Basics - Anfänger-Themen 4
R Enum und dann setter Setzen? Java Basics - Anfänger-Themen 44

Ähnliche Java Themen

Neue Themen


Oben