Wo am besten eine String Konstante initialisieren?

ideot2

Neues Mitglied
Hallo.
Ich habe Klassen B, C, D, E, F und G welche alle von A erben.
Alle Klassen überschreiben eine Methode
Code:
String convert(String input) {
    //code hier
}

Jetzt müssen B und C gebrauch von der selben RegEx machen.

Ich habe also mehrere Möglichkeiten:

1) Ich initialisiere den RegEx String in den überschriebenen Methoden in B und C
2) Ich initialisiere den RegEx String in der Superklasse A als public static Feld.
3) Ich initialisiere den RegEx String in der Superklasse A als private static Feld und biete Zugang über eine getter methode
4) ???

Ehrlich gesagt finde ich alle Möglichkeiten schlecht.
1) verstößt gegen DRY.
2) entblößt den regex im gesamten Code (welcher ziemlich groß ist)
2) und 3) initialisieren außerdem einen String (der reguläre Ausdruck) welcher nicht unbedingt viel mit der Klasse A zu tun hat was ich auch unschön finde.

Was kann ich in diesem Fall noch machen?

Um etwas genauer zu werden, der reguläre Ausdruck dient dazu, den input String auf eine bestimmte Art und Weise zu splitten. Nun habe ich aber zig andere Klassen die von A erben aber keine Verwendung für diesen regulären Ausdruck haben.
 
K

kneitzel

Gast
Also so Konstanten mache ich in der Regel immer public static final. Da ist die Sichtbarkeit aus meiner Sich kein wirkliches Problem. Konstanten sind in der Regel ja keine Implementierungsdezails, die zu kapseln sind. (Wobei Reguläre Ausdrücke da ggf. grenzwertig sind, ja)

Wenn du es aber wirklich nur in B und C haben möchtest, dann machst du eine neue Klasse, die von A erbt, in der dann die Konstante ist - von mir aus protected - und davon erben dann B und C.

Die Frage ist aber wirklich, ob eine einzelne Konstante dies so rechtfertigt ...
 
K

kneitzel

Gast
Wobei es hier um eine Funktionalität geht. Wenn die anderen Klassen, die von A erben, eine prinzipiell ähnliche Funktionalität haben, dann bietet sich ggf. auch sowas wie das Strategy Pattern an. Also man verschiebt die generelle Verarbeitung der Eingabe in eine Klasse. Das geht aber dann natürlich deutlich weiter was das Design angeht.

Wenn es eine spezielle Verarbeitung ist, dann ist das natürlich auch generell in eine eigenständige Klasse verschiebbar. Da sehe ich dann aber halt das Problem, dass dies dann gerne auf Helferklassen hinaus läuft, die bezüglich OO unschön sind.

Da kommen dann die *Utils *Helper oder Namen wie Strings / Arrays / ... zustande, die sich durch viele static Methoden auszeichnen...

Sowas kann man sich natürlich auch bauen. Und dann hat man die Funktionalität ja gekapselt - der RegEx ist dann ggf. versteckt und du hast die Funktionalität in einer oder mehrerer (ggf static) Methoden ...
 

mrBrown

Super-Moderator
Mitarbeiter
Generell wäre je nach Problem auch Vorschlag 1 möglich, nur weil etwas gleich aussieht, ist es ja nicht immer auch das selbe. Abkürzungen, Satzenden und Zahlen nutzen alle einen Punkt – trotzdem sollte man sich höllischst davor hüten, eine Konstante PUNKT = "." einzuführen, um nicht gegen DRY zu verstoßen (sowas sieht man btw ständig, wenn Anfänger von DRY, Magic Numbers und Konstanten hören...). Ohne den Kontext zu kennen, kann man das aber nicht wirklich beurteilen.

Was gegen Vorschlag 2 & 3 spricht, steht ja schon im Eröffnungspost, besonders den Punkt, dass A nichts damit zu tun hat, würde ich da als Ausschlaggebend ansehen.


Und als weitere Möglichkeit: man könnte den Regex einfach an die Objekte übergeben, die ihn brauchen, eröffnet dann je nach Nutzung dann auch noch weitere Möglichkeiten, zB kann der dann aus einer Konfig-Datei kommen. Hängt aber auch wieder sehr vom Kontext ab.

Wenn die anderen Klassen, die von A erben, eine prinzipiell ähnliche Funktionalität haben, dann bietet sich ggf. auch sowas wie das Strategy Pattern an. Also man verschiebt die generelle Verarbeitung der Eingabe in eine Klasse. Das geht aber dann natürlich deutlich weiter was das Design angeht.
In Richtung Strategy Pattern gehts ja auch schon, wenn man zB nur Regex und Matchen rauszieht, und das nur in B und C nutzt, gibt dann halt eine XYRegexStrategy. A und alle anderen Klassen sind davon ja nicht betroffen, ist also Designmäßig recht begrenzt.

Da sehe ich dann aber halt das Problem, dass dies dann gerne auf Helferklassen hinaus läuft, die bezüglich OO unschön sind.

Da kommen dann die *Utils *Helper oder Namen wie Strings / Arrays / ... zustande, die sich durch viele static Methoden auszeichnen...
Grundsätzlich stimm ich dir da völlig zu.
Das unschöne daran kann man aber zumindest einschränken, wenn es reines Implementierungsdetail ist und das auch explizit gemacht wird (zwischen 'steht direkt im Methodenbody', 'daraus ausgelagert in eine statische Methode in der selben Klasse' und 'die statische Methode in eine eigene Klasse gezogen' gibts halt "von außen" keinen Unterschied, kann aber "nach innen" durchaus eine Verbesserung sein) – auch wenn sich natürlich meistens trotzdem eine schönere Möglichkeit finden lässt.

Utils-Klassen sieht man gefühlt immer weniger, ein paar sind halt leider durch das Sprachdesign nötig, anders wären manche Sachen nicht praktikabel und sinnvoll nutzbar...Allerdings ist das eine völlig andere Baustelle :D
 

White_Fox

Top Contributor
nur weil etwas gleich aussieht, ist es ja nicht immer auch das selbe.
Genau...so ist es.

Ohne die exakte Aufgabenstellung zu kennen erinnert mich das aber an etwas, daß ich mal wie folgt gelöst habe.:
Java:
public abstract class MainDefinition{
    
    /**
     *Jede der erbenden Klassen macht eigentlich dasselbe, aber in einer anderen
     *"Geschmacksrichtung". Die "Geschmacksrichtung" wird durch diese Methode definiert.
     */
    protected abstract String getSpecialPhenotypeConstant();
    
    public void doTheSpecialThing(){
        //Tut das was alle machen, ruft dabei aber
        //die Methode getSpecialPhenotypeConstant() auf,
        //sodaß das Ergebnis in spezieller Ausprägung vorliegt.
    }
}

public class SpecialPhenotype extends MainDefinition{
    @Override
    protected abstract String getSpecialPhenotypeConstant(){
        return "Something";
    }
}

public class VerySpecialPhenotype extends MainDefinition{
    @Override
    protected abstract String getSpecialPhenotypeConstant(){
        return "Something else";
    }
}

Ich habe das so gemacht, um Dateien zu speichern. Drei oder mehr verschiedene Dateitypen, wo dann drei- oder mehrmals dasselbe gemacht wird und der einzige Unterschied in der Dateiendung besteht.

Ob die konkrete Aufgabenstellung da irgendwie vergleichbar ist...keine Ahnung. Grundsätzlich klingt mir das Problem auch nach Strategiemuster. Wenn da aber andererseits größerer, komplexer Code dranhängt der umgeschrieben werden müßte, und der nicht schlecht genug ist um ihn so umzukrempeln, dann liefern halt zwei Klassen diesselbe Konstante zurück.
Ob eine Lösung gut ist hängt nicht nur von ihrer Eleganz, sondern auch vom Aufwand ab um sie zu erreichen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Wie ereuge ich hier am besten eine Schleife Java Basics - Anfänger-Themen 12
G wo speichert man am besten eine Datei? Java Basics - Anfänger-Themen 4
D Datentypen Wie am Besten abspeichern Java Basics - Anfänger-Themen 1
S Wie debugge ich dies am besten: SingleThreadExecutor führt Task nicht aus..? Java Basics - Anfänger-Themen 29
julian-fr Wie kann ich am besten Java lernen? Java Basics - Anfänger-Themen 17
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
Salvatore321 Wie kann ich dieses Zustandsdiagramm am besten Umsetzen? Java Basics - Anfänger-Themen 5
dieter000 Hilfe bei dem Beispiel, wie gehe ich sowas am besten an? Java Basics - Anfänger-Themen 32
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
A Wie sollte ich es am besten an gehen - denkweise Java Basics - Anfänger-Themen 48
E Erste Schritte Java Webeintwicklung (JSP/Servlet), wie am Besten einsteigen? Java Basics - Anfänger-Themen 0
V welche Methode am besten sich für JPG einfügung in Java anzugewöhnen ? Java Basics - Anfänger-Themen 4
I Grafische Benutzeroberflächen - welche Komponente nehme ich am besten? Java Basics - Anfänger-Themen 13
DStrohma Best Practice Wie setze ich Suchparameter am besten? Java Basics - Anfänger-Themen 3
J Wie handle ich Threads am besten? Java Basics - Anfänger-Themen 2
H Wo speichert man am besten Daten? Appdata? Java Basics - Anfänger-Themen 14
B Datentypen Wie Daten am besten organisieren? Java Basics - Anfänger-Themen 7
M wie kann ich am besten die kleinste 2 elemente von einer Liste kriegen Java Basics - Anfänger-Themen 4
S Wie kann man am besten programmieren erlernen? Java Basics - Anfänger-Themen 32
P OOP Wie schreib ich dieses Programm am besten? Java Basics - Anfänger-Themen 6
B Wie lerne ich am besten? Java Basics - Anfänger-Themen 7
C Wie am besten die Verarbeitung der Eingabe verzögern ? Java Basics - Anfänger-Themen 5
C Wie Objekte am besten anklickbar machen ? Java Basics - Anfänger-Themen 9
H Wie lerne ich am Besten Java Java Basics - Anfänger-Themen 28
K OPP am besten verstehen !!! Java Basics - Anfänger-Themen 7
D Logging sätmlicher Vorgänge, wie am besten realisieren? Java Basics - Anfänger-Themen 6
A wie lernt man am besten den code zu verstehen? Java Basics - Anfänger-Themen 7
A Welches GUI nutze ich am Besten? Java Basics - Anfänger-Themen 7
B mit was am besten speichern und abrufen?+ fenster in fenster Java Basics - Anfänger-Themen 4
G Massenersetzungen am besten auch mit replaceAll? Java Basics - Anfänger-Themen 3
F Anfänger - die besten Tipps Java Basics - Anfänger-Themen 3
G Wann am besten getSize() aufrufen? Java Basics - Anfänger-Themen 6
S Wie am besten JAVA lernen Java Basics - Anfänger-Themen 12
D Fehlerbehandlungen, wie am besten sinnvoll einsetzen? Java Basics - Anfänger-Themen 6
S schwieriger String für StringTokenizer, wie am Besten ? Java Basics - Anfänger-Themen 8
frau-u guter Stil - wie macht mans am Besten? Java Basics - Anfänger-Themen 8
A Wie fange ich am besten mit nem Programm an? Java Basics - Anfänger-Themen 10
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
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
I In unterschiedlichen Applikation Zugriff auf eine gemeinsame Anwendung? Java Basics - Anfänger-Themen 8
D 2 ArrayListen gleich sortieren bzw. eine Liste anhand einer anderen Sortieren Java Basics - Anfänger-Themen 6
T Ich brauche eine Schleife die eine beliebige Zahl so lange durch 10 teilt bis zur Null Java Basics - Anfänger-Themen 5
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
J Eine konzeptionelle Frage zu OOP Java Basics - Anfänger-Themen 3
N Ich kriege ganze zeit die Fehlermeldung "Inhalt der Zwischenablage kann nicht in die ausgewählten Elemente eingefügt werden" hat jemand eine Lösung? Java Basics - Anfänger-Themen 6
M Vergleichen, ob eine Liste länger als andere ist Java Basics - Anfänger-Themen 6
T Methode soll etwas ausrechnen und zurückgeben (klappt nd) hat wer eine Idee? Java Basics - Anfänger-Themen 11
Shadowrunner Variablen Gibt es eine Möglichkeit die Ziffern/Stellen einer Zahl fest zu legen? Java Basics - Anfänger-Themen 3
Kingdako Wie löse ich eine Mathematische Formel mit Arrays und Schleifen? Java Basics - Anfänger-Themen 32
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
G Wie wartet man bis ein URL eine Antwort zurückgibt? Java Basics - Anfänger-Themen 5
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
S 2 Reihen ratio-btn, eine Reihe funktioniert andere nicht Java Basics - Anfänger-Themen 4
T Eingabe durch eine Zahl dividieren nachgucken? Java Basics - Anfänger-Themen 4
M mit Maven eine ausführbare Jar bauen Java Basics - Anfänger-Themen 7
P Java Selenium . Parameterized.Parameters erzeugt eine Fehlermeldung Java Basics - Anfänger-Themen 14
J Zugriff auf eine 2. Klasse die per UI-Designer erstellt wurde Java Basics - Anfänger-Themen 1
M Eine Funktion zuweisen Java Basics - Anfänger-Themen 3
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
A Methoden Guten Tag , ich wollte so machen dass wenn meine frog an eine fly/bee geht dann an meine Tafel geht der zahl +1 hoch. Java Basics - Anfänger-Themen 2
A Wie führe ich eine Batch-Datei von meiner Java-Anwendung aus? Java Basics - Anfänger-Themen 18
J Beim Start des Programms zB. eine Linie in JPanel ausgeben Java Basics - Anfänger-Themen 4
L Methoden Eine Methode um zu testen ob es ein Nachbar gibt Java Basics - Anfänger-Themen 10
S Eine Idee umsetzen ganz schnell!? Java Basics - Anfänger-Themen 68
I Grundsatzfrage: Belegt eine Referenz auf 'null' RAM, und wenn ja - wieviel ;-) ? Java Basics - Anfänger-Themen 5
jeff98 Wie kann man in Java eine Zeichenformation ausgeben? Java Basics - Anfänger-Themen 9
K loop pausieren für eine bestimmte Anzahl? Java Basics - Anfänger-Themen 1
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
Thomas06 Wie kann man mithilfe von boolean herausfinden ob eine zahl durch 5 und 7 teilbart ist ? Java Basics - Anfänger-Themen 7
M Prüfen on eine Zahl im String enthalten ist Java Basics - Anfänger-Themen 3
U jUnit 5 Test für eine addMethode Java Basics - Anfänger-Themen 18
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
A Eclipse IDE - Wie bekomme ich eine ältere Version Java Basics - Anfänger-Themen 6
F Wie kann ich eine Funktion schreiben, die nur in bestimmten Fällen einen Wert zurückgibt? Java Basics - Anfänger-Themen 5
berserkerdq2 Warum muss man manchmal in der RUnmethode sleep in eine schleife tun? Java Basics - Anfänger-Themen 9
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
berserkerdq2 Sende eine Nachricht an den Client und leere den Ausgabestorm, was ist damit genau gemeint? Java Basics - Anfänger-Themen 3
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
sserio Prüfen, ob eine Zahl eine periodische Zahl ist Java Basics - Anfänger-Themen 20
L Anpassung der Spaltenbreite auch auf eine zweite Tabelle anwenden Java Basics - Anfänger-Themen 8
NadimArazi Wie kann ich eine collision detection für die Paddles in meinem Pong Programm hinzufügen? Java Basics - Anfänger-Themen 4
JordenJost Java ist auch eine Insel für Anfänger Java Basics - Anfänger-Themen 2
berserkerdq2 Warum soll ich shuffle nutzen, um bei Rückgabewert Collection eine Liste zurückzugeben? Java Basics - Anfänger-Themen 3
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
berserkerdq2 Überprüfen ob eine Schreibberechtigung auf ein file exisitert bzw. ob man dieses file löschen kann, wie? Java Basics - Anfänger-Themen 9
sserio Java Fx, wie erstellt man einen EventHandler, der durch das Drücken eines Button Texte in eine Table view einfügt Java Basics - Anfänger-Themen 17
M Eine Methode die erkennt ob die ein gegebene zahl größer oder kleiner sein muss Java Basics - Anfänger-Themen 2
Avalon Warum funktioniert eine Bedingung und eine andere nicht? Java Basics - Anfänger-Themen 2
F Suche nach betreuender Person für eine Jahresarbeit der 12. Klasse. Java Basics - Anfänger-Themen 6
X Hilfe beim Übertragen in eine For-Schleife Java Basics - Anfänger-Themen 1
H Eine Methode über Actionlistener beenden Java Basics - Anfänger-Themen 8
A Wenn eine Zahl durch 7 teilbar ist, soll statt der Zahl ein ‘*‘ angezeigt werden. java? Java Basics - Anfänger-Themen 47
U Warum gibt das eine Nullpointerexception? (Switch) Java Basics - Anfänger-Themen 6
U Warum kriege ich hier eine nullpointer exception, sehe den Fehler nicht (swing) Java Basics - Anfänger-Themen 1
K Warum gibt mir z. B. 40^128 eine Zahl? Ich dachte mit xor kann man nur booleanwerte erhalten, also prüfen ob etwas whar oder falsch ist? Java Basics - Anfänger-Themen 1
M Wie lassen sich Objektkonstanten initialisieren, wenn sie eine Bedingung erreichen? Java Basics - Anfänger-Themen 6
K Präzedenregeln in Java sagen, dass +expr und -expr vor + von Addition und - von Addition stehen, warum wird dann z. B. a+b als eine Addition ausgeführ Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben