Klassen Enum als Informationsträger

Javinner

Top Contributor
Guten Tag an alle,

ist es sinnvoll, feststehende Informationen in ein Enum zu meißeln?
Wenn nicht: was spricht dagegen, wie hätte man es besser machen können?
Problemlose Erweiterung und Implementierung steht dabei im Vordergrund.

Java:
public class SystemRobotService
{

    public static void main(String[] args)
    {

        Planet planetA = new Planet(Sternsystem.STERN_A_PLANET_A.getName(), Sternsystem.STERN_A_PLANET_A.getDurchmesser(), Sternsystem.STERN_A_PLANET_A.getTemperatur());
        Planet planetB = new Planet(Sternsystem.STERN_A_PLANET_B.getName(), Sternsystem.STERN_A_PLANET_B.getDurchmesser(), Sternsystem.STERN_A_PLANET_B.getTemperatur());
        Kunde kunde = new Kunde();
        kunde.addToPlanetList(planetA);
        kunde.addToPlanetList(planetB);
        kunde.getListInformation();
    }

}
/** Konsolenausgabe */
Name: Planet A, Durchmesser: 1000.0, Temperatur: 15.4
Name: Planet B, Durchmesser: 2000.0, Temperatur: 32.6
Java:
enum Sternsystem
{
    STERN_A_PLANET_A("Planet A", 1000, 15.4), STERN_A_PLANET_B("Planet B", 2000, 32.6);

    private final String name;
    private final double durchmesser;
    private final double temperatur;

    private Sternsystem(String name, double durchmesser, double temperatur)
    {
        this.name = name;
        this.durchmesser = durchmesser;
        this.temperatur = temperatur;
    }

    public String getName()
    {
        return name;
    }

    public double getDurchmesser()
    {
        return durchmesser;
    }

    public double getTemperatur()
    {
        return temperatur;
    }

}
Java:
public interface Planetable
{

    abstract String getOrbitProperties();

    abstract String getPhysicalProperties();

    abstract String getAtmosphericProperties();
}
Java:
class Planet implements Planetable
{

    private final String name;
    private final double durchmesser;
    private final double temperatur;

    public Planet(String name, double durchmesser, double temperatur)
    {
        this.name = name;
        this.durchmesser = durchmesser;
        this.temperatur = temperatur;
    }

    @Override
    public String toString()
    {
        String text;
        text = "Name: " + this.name + ", Durchmesser: " + this.durchmesser + ", Temperatur: " + this.temperatur;
        return text;
    }

    protected String getName()
    {
        return name;
    }

    protected double getDurchmesser()
    {
        return durchmesser;
    }

    protected double getTemperatur()
    {
        return temperatur;
    }

    /**
     * All die Methoden sollen noch ausgebaut werden.
     */
    @Override
    public String getOrbitProperties()
    {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String getPhysicalProperties()
    {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String getAtmosphericProperties()
    {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}
Java:
class Kunde
{

    private final List<Planet> planets;

    Kunde()
    {
        this.planets = new ArrayList<>();
    }

    protected void addToPlanetList(Planet planet)
    {
        this.planets.add(planet);
    }

    protected void removeFromPlanetList(Planet planet)
    {
        if (!this.planets.contains(planet)) {
            throw new IllegalArgumentException("Planet ist nicht in der Liste enthalten");
        } else {
            this.planets.remove(planet);
        }

    }

    protected void getListInformation()
    {
        planets.forEach((p) -> {
            System.out.println(p.toString());
        });
    }

}
 

Manuel.R

Bekanntes Mitglied
hmm
Java selbst sagt.....
An enum type is a special data type that enables for a variable to be a set of predefined constants. The variable must be equal to one of the values that have been predefined for it. Common examples include compass directions (values of NORTH, SOUTH, EAST, and WEST) and the days of the week.

aber verboten ist es nicht:

Code:
public enum Planet {
    MERCURY (3.303e+23, 2.4397e6),
    VENUS   (4.869e+24, 6.0518e6),
    EARTH   (5.976e+24, 6.37814e6),
    MARS    (6.421e+23, 3.3972e6),
    JUPITER (1.9e+27,   7.1492e7),
    SATURN  (5.688e+26, 6.0268e7),
    URANUS  (8.686e+25, 2.5559e7),
    NEPTUNE (1.024e+26, 2.4746e7);

    private final double mass;   // in kilograms
    private final double radius; // in meters
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }
    private double mass() { return mass; }
    private double radius() { return radius; }

    // universal gravitational constant  (m3 kg-1 s-2)
    public static final double G = 6.67300E-11;

    double surfaceGravity() {
        return G * mass / (radius * radius);
    }
    double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
    public static void main(String[] args) {
        if (args.length != 1) {
            System.err.println("Usage: java Planet <earth_weight>");
            System.exit(-1);
        }
        double earthWeight = Double.parseDouble(args[0]);
        double mass = earthWeight/EARTH.surfaceGravity();
        for (Planet p : Planet.values())
           System.out.printf("Your weight on %s is %f%n",
                             p, p.surfaceWeight(mass));
    }
}
 

temi

Top Contributor
Es ist halt blöd, wenn irgendwann STERN_A_PLANET_C oder STERN_D_PLANET_Z dazukommen. Dazu muss dann immer der Quelltext angefasst werden.
 

Javinner

Top Contributor
Es ist halt blöd, wenn irgendwann STERN_A_PLANET_C oder STERN_D_PLANET_Z dazukommen. Dazu muss dann immer der Quelltext angefasst werden.
Der Quelltext muss im Fall einer Erweiterung sowieso angepasst werden.
Inspiriert wurde ich dazu durch: http://www.torsten-horn.de/techdocs/java-enums.htm
und http://www.angelikalanger.com/Articles/EffectiveJava/28.Enums/28.Enums.html

Da ich noch keine Ahnung von Datenbanken habe und letztendlich nicht weiß, wie man hier sich anders hätte helfen können, schien mir die Lösung mit dem Enum als die Beste. Anfangs dachte ich an eine finale Klasse, welche dann bei Initialisierung des jeweiligen Planets diesen füllt. Aber auch hier wäre ein Enum mit im Spiel:
Java:
public Planet(Enum e)
{
    this = DataBank.getSystemPlanet(e);
}
Das war jedoch schnell unübersichtlich, alleine wegen der Abfrage (wenn es mehrere Sternsysteme mit X-Planeten gibt, dann ist es keine Lösung). So bin ich auf den Enum gekommen und bis jetzt scheint es das Mittel der Wahl sein. Gerne lasse ich mich an dieser Stelle überzeugen.
 

mrBrown

Super-Moderator
Mitarbeiter
aber verboten ist es nicht:
Was soll nicht verboten sein, Enums zu benutzen? o_O

Der Quelltext muss im Fall einer Erweiterung sowieso angepasst werden.
Jein - soll bei einem enum ein Planet dazu kommen, muss der Quellcode des enums geändert werden.
Ohne enum könnte man entsprechende Klassen und Instanzen dynamisch laden.

Da ich noch keine Ahnung von Datenbanken habe
Besser so - ob die Dinge aus einer Datenbank oder sonstwo herkommen, muss deinem Code egal sein ;)

Das war jedoch schnell unübersichtlich, alleine wegen der Abfrage (wenn es mehrere Sternsysteme mit X-Planeten gibt, dann ist es keine Lösung). So bin ich auf den Enum gekommen und bis jetzt scheint es das Mittel der Wahl sein. Gerne lasse ich mich an dieser Stelle überzeugen.
Das gleiche Problem gäb's bei Enums doch auch, wenns plötzlich endlos viele wären ;)
Wobei das kein wirkliches Problem ist, man kann durchaus Listen von Listen als ganzes laden.


Zu der generellen Frage (wenn ich sie richtig verstehe): JA! Methoden und Variablen gehören zu einem enum dazu.
Enums sind aber nur dann sinnvoll, wenn es ein festes, begrenztes Set an Werten gibt.
 

Javinner

Top Contributor
mrBrown hat gesagt.:
Ohne enum könnte man entsprechende Klassen und Instanzen dynamisch laden.
Zauberwort dynamisch laden: also für jedes System eine Liste anlegen und bei Erzeugung des Planeten daraus lesen?
Enums sind aber nur dann sinnvoll, wenn es ein festes, begrenztes Set an Werten gibt.
Das wollte ich lesen ;) Also wäre diese Herangehensweise auch eine mögliche sagen wir bei Monopoly.
 

mrBrown

Super-Moderator
Mitarbeiter
Zauberwort dynamisch laden: also für jedes System eine Liste anlegen und bei Erzeugung des Planeten daraus lesen?
ja, oder z.B. alles aus Dateien laden.

Das wollte ich lesen ;) Also wäre diese Herangehensweise auch eine mögliche sagen wir bei Monopoly.
ja, möglich wäre es.
Wobei man dort vielleicht besser mit einer einfachen csv, aus der es geladen wird, bedient ist. ist immer viel Abwägen.
 

Javinner

Top Contributor
CSV? Lese ich zum ersten Mal :) Jetzt lese ich in der Insel, dass XML auch etwas aus der Richtung ist..
Dieser Weg wird kein leichter sein, dieser Weg wird steinig und schwer.. Also los
 

temi

Top Contributor
Generell gesprochen ist es eine gute Idee deinen Code unabhängig von einer konkreten Persistenzlösung zu machen. mrBrown hat das oben auch schon mal kurz angesprochen:
ob die Dinge aus einer Datenbank oder sonstwo herkommen, muss deinem Code egal sein
Das bezeichnet man z.B. als DAL (= data access layer).
Du solltest deine Klassen für die Daten wie "Planet" und "Sternensystem" haben und eine separate Klasse "Loader", die die Daten von einer konkreten Quelle, ob DB oder CSV, XML, JSON, was auch immer holt. Ideal ist "Loader" ein Interface, dann ist es später einfach vom "CSVLoader" zum "DBLoader" zu wechseln, wenn die Datenmengen steigen o.ä.
 
Ä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
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
kaoZ Variablen Konstantensammlung vs. Enum Java Basics - Anfänger-Themen 9
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