Ist Ableiten hier sinnvoll

DaBe1812

Bekanntes Mitglied
Hi, ich habe eine kleine Klasse für Konfigurationen
Java:
public class ReferenceSystemConfig {
    private Map<String,String> fieldMapping;
    private String username;
    private String password;
    private boolean ssl;
    private String server;
    private Integer port;
    private Map<String, Object> misc;

    @SuppressWarnings("unchecked")
    public ReferenceSystemConfig(Map<String, Object> configMap) {
        misc = new HashMap<>();
        for(String parameter : configMap.keySet()) {
            Object value = configMap.get(parameter);
            switch(parameter) {
            case "FIELDMAPPING":
                fieldMapping = (Map<String, String>) value;
                break;
            case "USER":
                username = (String) value;
                break;
            case "PASSWORD":
                password = (String) value;
                break;
            case "SSL":
                ssl = (Boolean) value;
                break;
            case "SERVER":
                server = (String) value;
                break;
            case "PORT":
                port = (Integer) value;
                break;
            default:
                misc.put(parameter, value);
            }
        }

    }

    public Object get(String key) {
        if(misc.containsKey(key)) {
            return misc.get(key);
        }
        return null;
    }
    
    public Map<String,String> getFieldMapping() { return fieldMapping; }
    public String getUsername() { return username; }
    public String getPassword() { return password; }
    public boolean isSsl() { return ssl; }
    public String getServer() { return server; }
    public Integer getPort() { return port; }
    public Map<String, Object> getMisc() { return misc; }
}

In dieser Form speichere ich die Konfiguration für viele verschieden Systeme. Wie man sieht sind ein paar Parameter bei allen Systemen gleich und ein paar kommen nur bei einigen wenigen Systemen vor, z.B. hat ein System eine Datenbank, das würde ich dann über ein get("DATABASE") abrufen.
Aktuell speichere ich aber die Daten in der Datenbank einigermaßen typsicher ab und wollte das auch in der Klasse repräsentieren.

Dabei habe ich mir gedacht, dass es vielleicht Sinn machen würde von der Klasse ab zu leiten und als Kind dann eine Klasse zu haben, die Datenbanken kennt.

Aber macht das Sinn? Dann müsste ich doch in meinem Code immer darauf hinweisen, dass ich jetzt keine ReferenceSystemConfig habe, sondern eine ReferenceSystemConfigWithDatabase oder so. D.h. ich müsste in meinen Methoden dann von ReferenceSystemConfig auf eines ihrer Kinder casten, damit ich dann eine Methode getDatabase verwenden kann. Oder habe ich gerade einen Haken im Kopf und denke falsch?
 

Robert Zenz

Top Contributor
Ja und Nein, es kommt darauf an was genau und wieviel davon du vorhast.

Zunaechst wuerde ich die lokalen Felder einstampfen und durch einen Zugriff in die Map ersetzen, dann hast du weniger Sonderfaelle zu beachten:

Java:
public String getUsername() {
    return getWithCast("USERNAME");
}

private <VALUE_TYPE> VALUE_TYPE getWithCast(String key) {
    if (values.containsKey(key)) {
        return (VALUE_TYPE)values.get(key);
    }
    
    return null;
}

Dann kannst du auch dein groszes switch einstampfen. Pruefungen kannst du dann ja auch in der getWithCast machen wenn du sie willst.

Um zu deiner eigentlichen Frage zurueck zu kommen, wenn du oefters den Fall haben wirst das es eine Datenbank gibt, oder eben auch keine, kann es natuerlich Sinn machen hier eine Klassenstruktur aufzubauen:

Java:
public class ReferenceSystemConfig { }
public class DatabaseAwareReferenceSystemConfig extends ReferenceSystemConfig { }

Das hat den Vorteil dass du mit Methoden arbeiten kannst um diese Werte zu holen, aber du musst natuerlich immer pruefen ob diese auch in der initialen Map vorkommen. Man gewinnt aber nur relativ wenig. Ich sage mal wenn du drei Projekte hast ohne Datenbank, und zwei mit, wuerde ich da eine Klasse fuer alle machen. Wenn das alles nur intern ist, spielt das keine Rolle.

Wenn das irgendwie in einer Bibliothek enden soll, dann wuerde ich das sauber auftrennen, ja.

Ein anderer Ansatz, aber etwas komplexer, koennte sein wenn du dir die Konifguration in einzelne Abschnitte aufteilst.

Java:
public class ReferenceSystemConfig {
    public DatabaseConfig getDatabaseConfig() {}
    public ServerConfig getServerConfig() {}
    public UserConfig getUserConfig() {}
}

Dann hast du eine Klasse und von dieser kannst du "dynamisch" die einzelnen Konfigurationen holen die du brauchst. Wenn es keine gibt, retourniert mal entweder null oder wirft einen Fehler dass dieser Abschnitt fehlt.
 

DaBe1812

Bekanntes Mitglied
Hi,
deine erste Lösung mit VALUE_TYPE finde ich ganz interessant. Die Möglichkeit kannte ich noch gar nicht.
Damit kann ich in den nachgelagerten Klassen schonmal die unchecked und Co umgehen.

Evtl. werde ich für einige Configs Methoden hinzufügen, die über die get hinaus gehen, also z.B. getDatabase(), im schlechtesten Fall liefert die Methode null, aber das ist dann eben so und muss da gehandelt werden, wo ich auf den Parameter zugreifen möchte.

Das Objekt an sich wird nur intern verwendet und schlägt nicht auf's Frontend durch.

Danke für die Hilfe.
 

DaBe1812

Bekanntes Mitglied
Hi,
dass der Cast möglich sein muss, ist verständlich.

Kann man das Ganze auch noch weiter treiben?

Ich habe eine Entity, die hängt an einer Tabelle mit Parametern. In einer Spalte habe ich ein Enum für den Datentyp des Parameters und dann jeweils eine Spalte für String, Integer, Double, Date und Boolean.

Jetzt biete ich zwar für jede Spalte einen eigenen getter an, aber Grundsätzlich will ich mit getValue() einfach den Wert in seinem Datentyp erhalten.

Bis jetzt habe ich dafür eine Funktion:
Java:
    public Object getValue() {
        switch(datatype) {
        case BOOLEAN:
            return booleanValue;
        case INTEGER:
            return integerValue;
        case PASSWORD:
        case STRING:
            return stringValue;
        case LIST:
            return Arrays.asList(stringValue.split(","));
        case MAP:
            return JsonHelper.toLinkedMap(stringValue);
        default:
            return null;
        }
    }

Aber mit den Generics könnte ich ja grundsätzlich eine Funktion bauen, die sich dann anhand vom geforderten Datentyp das richtige Feld zieht, oder eben null, wenn es den Datentyp nicht gibt. Aber irgendwie bekomme ich das nicht so richtig zum Laufen.
 

temi

Top Contributor
Wenn ich so "Entity" und "verschiedene Parameter" lese, hast du dir mal das Konzept ECS (Entity Component System) angeschaut? Das wird in der Spieleprogrammierung häufig eingesetzt. Möglicherweise wäre das eine Möglichkeit für dich, ohne jetzt zu wissen, was du überhaupt tust.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Ableiten von Typ "T" Java Basics - Anfänger-Themen 8
M Mathematische Funktion: Ableiten Java Basics - Anfänger-Themen 2
Houly Variablen ableiten mit 2 Strings Java Basics - Anfänger-Themen 12
G JFrame + JMenu aus einer anderen Klasse ableiten Java Basics - Anfänger-Themen 5
W Von 2 Klassen ableiten JFrame und WindowAdapter Java Basics - Anfänger-Themen 3
A Thread ableiten Java Basics - Anfänger-Themen 6
MasterEvil Eine Klasse von mehreren Klassen ableiten? Java Basics - Anfänger-Themen 12
M Konstanten ableiten und überschreiben Java Basics - Anfänger-Themen 2
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
B Dekorator Muster - Irgendwas stimmt hier doch nicht? Java Basics - Anfänger-Themen 4
frager2345 Warum muss ich hier im Konstruktor meine Exeption nicht abfangen ? Java Basics - Anfänger-Themen 4
D Warum kann ich hier nicht auf die Methode zugreifen? Java Basics - Anfänger-Themen 5
H BlueJ: was genau ist hier der Fehler? Java Basics - Anfänger-Themen 14
J Hallo zusammen , was macht diese Methode hier genau? Java Basics - Anfänger-Themen 3
U Warum kriege ich hier eine nullpointer exception, sehe den Fehler nicht (swing) Java Basics - Anfänger-Themen 1
M Was wird hier genau getestet? Java Basics - Anfänger-Themen 9
M Was habe ich hier falsch, dass wenn ich z.B.: 11 eingebe mir false zurück gegeben wird? Java Basics - Anfänger-Themen 2
M Kann mir jemand hier die Logik vermitteln? Java Basics - Anfänger-Themen 3
M Wie kann ich hier den Abstand ausgeben? Java Basics - Anfänger-Themen 3
S Wie kann ich bei diesem Code erreichen, das als Ergebnis hier 15 herauskommt? Java Basics - Anfänger-Themen 23
P Weswegen entstehen hier Syntaxfehler? Java Basics - Anfänger-Themen 3
J Wie kann ich hier eine While schleife einbauen? Java Basics - Anfänger-Themen 3
A Wieso bekomme ich hier zwei unterschiedliche Ausgaben? Java Basics - Anfänger-Themen 6
S Was für Aufgaben könnten sich hier hinter verbergen? Java Basics - Anfänger-Themen 5
R Warum werden hier nur die grün und orangen Linien ausgegeben und der Rest unten nicht? Java Basics - Anfänger-Themen 5
R Wie würde hier die if-Anweisung aussehen? Java Basics - Anfänger-Themen 18
S Operatoren i=i++; Was passiert hier? Java Basics - Anfänger-Themen 21
G Warum ist hier ein Lamda-Ausdruck möglich Java Basics - Anfänger-Themen 2
O Was bedeutet das hier 999_983? Java Basics - Anfänger-Themen 2
F Warum ist die Ausgabe hier 1? Java Basics - Anfänger-Themen 4
P Vererbung Warum funktioniert die Vererbung hier nicht Java Basics - Anfänger-Themen 14
M Wie kann ich hier ein Textfeld hinzufügen Java Swing? Java Basics - Anfänger-Themen 1
L Collections Ist eine Arraylist hier das richtige? Java Basics - Anfänger-Themen 12
S Unklarer Code (was passiert hier?) Java Basics - Anfänger-Themen 1
R Kann mir hier jemand weiterhelfen? Java Basics - Anfänger-Themen 1
B Wieso wird hier so viel als falsch angezeigt? Java Basics - Anfänger-Themen 2
B Wieso gibt er hier nur die ungeraden Zahlen aus? Java Basics - Anfänger-Themen 5
B Kann mir jemand erklären, warum hier dreimal was ausgegeben wird und nicht nur zweimal? Java Basics - Anfänger-Themen 16
P Compiler-Fehler Wo befindet sich hier der Fehler und warum? Java Basics - Anfänger-Themen 21
K Public Attribute oder getter - funktioniert leider beides hier nicht Java Basics - Anfänger-Themen 5
F Operatoren Wieso fliegt hier eine NullPointer Exception :( Java Basics - Anfänger-Themen 3
K Was wird hier nacheinander gemacht? Java Basics - Anfänger-Themen 1
L [ARRAY] Werden hier die Indezes oder die Werte vergliechen? Java Basics - Anfänger-Themen 4
M Liegt hier bereits ein Bad Smell vor? Java Basics - Anfänger-Themen 9
K Was macht hier genau return? Java Basics - Anfänger-Themen 2
V in diesem Forum wurde mir am meisten geholfen, daher eine Frage die hier nicht passt. sry (VB Frage) Java Basics - Anfänger-Themen 3
T boolean, was passiert hier? Java Basics - Anfänger-Themen 4
O euer chat hier Java Basics - Anfänger-Themen 1
R kann mir jemand erklären was hier gemacht wurde? Java Basics - Anfänger-Themen 10
K Wie übergebe ich hier korrekt die Werte Java Basics - Anfänger-Themen 5
B Warum gibst hier Equals false zurück ? Java Basics - Anfänger-Themen 23
V Warum wird hier 200 ausgeliefert? Java Basics - Anfänger-Themen 39
S Klassen Klasse oder nicht Klasse - das ist hier die Frage Java Basics - Anfänger-Themen 6
W Methoden Wie wird eine Methode hier aufgerufen? Java Basics - Anfänger-Themen 5
S wieso Fehlermeldung cannot find symbol hier Java Basics - Anfänger-Themen 10
K Was ist hier Falsch? Java Basics - Anfänger-Themen 3
L Erste Schritte Sollte ich hier lieber Cases verwenden oder wäre eine If-Bedingung besser? Java Basics - Anfänger-Themen 6
E Kann mir jemand sagen was hier falsch ist? Java Basics - Anfänger-Themen 6
J Was passiert hier? Java Basics - Anfänger-Themen 6
D Wie "unchecked cast" hier vermeiden? Java Basics - Anfänger-Themen 2
R Wieso hänge ich hier in einer Endlosschleife (vermute ich zumindest)? Java Basics - Anfänger-Themen 2
Q switch case hier möglich Java Basics - Anfänger-Themen 10
P Was ist hier falsch? Java Basics - Anfänger-Themen 6
Luk10 Wo zum Teufel fehlen Hier Klammern? Java Basics - Anfänger-Themen 2
T Was mache ich hier falsch? Java Basics - Anfänger-Themen 3
M Was könnte hier nicht stimmen??? Java Basics - Anfänger-Themen 9
K Warum funktioniert hier die setText methode? Java Basics - Anfänger-Themen 3
S Wie ereuge ich hier am besten eine Schleife Java Basics - Anfänger-Themen 12
K Hier noch ein Konstruktor aufbauen Java Basics - Anfänger-Themen 6
G Welche Datenstruktur ist hier die sinnvolste Java Basics - Anfänger-Themen 6
M warum kompiliert das hier nicht? Java Basics - Anfänger-Themen 3
G Probleme mit break hier; in if-Bedingung Java Basics - Anfänger-Themen 5
S Hallo, ich hab hier ein Buch Java Basics - Anfänger-Themen 11
S Warum wirkt hier synchronized nicht? Java Basics - Anfänger-Themen 9
S Funktion hier sinnvoll ? Java Basics - Anfänger-Themen 4
zilti Was ist hier falsch? Java Basics - Anfänger-Themen 13
S Bot Fragen(hoffe das ist hier richtig) Java Basics - Anfänger-Themen 12
D was stimmt hier nicht? Java Basics - Anfänger-Themen 7
W HTML oder nicht? Das ist hier die Frage. Java Basics - Anfänger-Themen 4
G Abstrakte Klasse (was passiert hier) Java Basics - Anfänger-Themen 3
K Was ist hier faul? Java Basics - Anfänger-Themen 29
L Was stimmt hier nicht Java Basics - Anfänger-Themen 2
G konkretes beispiel: interface hier besser als abstrakte kl. Java Basics - Anfänger-Themen 4
V Reihenfolge von Befehlen - hier repaint() zu spät Java Basics - Anfänger-Themen 13
G was ist hier falsch? Java Basics - Anfänger-Themen 5
E Wo liegt hier der Fehler? Java Basics - Anfänger-Themen 13
L wo liegt hier der fehler? Java Basics - Anfänger-Themen 3
C Wie muss man hier aufrufen von 2 eigenen Klassen? Java Basics - Anfänger-Themen 6
J JInternalFrame: Warum funktioniert das hier nicht? Java Basics - Anfänger-Themen 11
P was ist denn hier falsch ? (nur 1Zeile) Java Basics - Anfänger-Themen 21
H Wie hier die Progressbar benutzen? Java Basics - Anfänger-Themen 8
M Was wird hier geprüft? Java Basics - Anfänger-Themen 10
D Was ist hier falsch in der JTable? Java Basics - Anfänger-Themen 5
ven000m Was läuft hier nicht gescheit? Java Basics - Anfänger-Themen 12
megachucky Suche ein paar gute Tutorials so wie dieses hier. Java Basics - Anfänger-Themen 4
3 Verschiedene Fragen (bin neu hier) Java Basics - Anfänger-Themen 5
M Warum rechnet Java hier nicht richtig? Java Basics - Anfänger-Themen 3
H weiss nicht wo hier der fehler liegt Java Basics - Anfänger-Themen 3
J hier Random oder was Einzusetzen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben