Wo am besten eine String Konstante initialisieren?

I

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.
 
kneitzel

kneitzel

Top Contributor
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 ...
 
kneitzel

kneitzel

Top Contributor
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

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
 
W

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
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
M Nach einer erstmaligen Eingabe, eine zweite Eingabe nur noch gegen bestätigung möglich Java Basics - Anfänger-Themen 2
TimoN11 Java - Eine oder mehrere Eingaben möglich machen Java Basics - Anfänger-Themen 6
A Wie schaffe ich das eine while Schleife addiert danach subtrahirt? Java Basics - Anfänger-Themen 1
Y Einfügen in eine doppelt verkettete Liste Java Basics - Anfänger-Themen 8
T Ich habe eine Variabel die nicht Methoden übergreifend ist. Kann mir jemand Helfen :) Java Basics - Anfänger-Themen 5
H Daten aus einer Datei in eine Liste speichern Java Basics - Anfänger-Themen 23
Tino1993 for-Schleife, die eine vorgegebene Anzahl von Zeichen ausgibt Java Basics - Anfänger-Themen 3
newcomerJava Nach doppelter Zahl eine Ausgabe Java Basics - Anfänger-Themen 10
jonny_2k12 Wie kann ich eine ArrayList aus einer Klasse in eine andere übergeben? Java Basics - Anfänger-Themen 21
S Eine Liste kopieren Java Basics - Anfänger-Themen 13
A eine neue normale String-Array von einer String-Array, die in for schleife ist, schaffen Java Basics - Anfänger-Themen 3
java3690 eine liste sortieren Java Basics - Anfänger-Themen 12
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
K Übergabe des Wertes einer Variable aus main() in eine Klassenmethode Java Basics - Anfänger-Themen 8
J Wie kann ich hier eine While schleife einbauen? Java Basics - Anfänger-Themen 3
P Was genau bringt mir es ein Array in eine Liste zu bringen Java Basics - Anfänger-Themen 3
J Eine Frage zur Schreibweise == ? : Java Basics - Anfänger-Themen 3
N Wie teste ich eine geworfene Exception? Java Basics - Anfänger-Themen 8
B Eine Methode erstellen Java Basics - Anfänger-Themen 3
L Konstruktor für eine Map-Datei/Map-Datei einlesen Java Basics - Anfänger-Themen 5
Y Methoden Wie kann ich eine if-Abfrage bei Setters bauen? Java Basics - Anfänger-Themen 6
I Sortiert eine HashMap nicht gleich wie eine ArrayList? Java Basics - Anfänger-Themen 1
L Iterieren durch eine ArrayList. Integer Array wird übergeben Java Basics - Anfänger-Themen 17
KogoroMori21 Mit einer Schleife eine Treppe zeichnen Java Basics - Anfänger-Themen 29
J Eine Position im String durch einen Integer - Wert teilen Java Basics - Anfänger-Themen 5
M Verständnisfrage zu eine Online Aufgabe Java Basics - Anfänger-Themen 7
N Wie kann ich eine meine Variable Final machen? Java Basics - Anfänger-Themen 1
H Datentypen Was für eine Format verbirgt sich hinter dem Integer-Wert 053? Java Basics - Anfänger-Themen 2
C Methoden Java ist auch eine Insel Listing 2.40 Recursion Java Basics - Anfänger-Themen 7
F Eine Zahl mit Arrays vergleichen Java Basics - Anfänger-Themen 7
P Eine komplizierte Sache Java Basics - Anfänger-Themen 1
B Nur eine bestimmte Anzahl an Arrays ausgeben Java Basics - Anfänger-Themen 9
M Zugriff auf eine ArrayList in einer anderen Klasse Java Basics - Anfänger-Themen 4
T Wie eine Komposition garantieren Java Basics - Anfänger-Themen 5
M Wie analysiert JSON eine toString-Ausgabe ? Java Basics - Anfänger-Themen 1
V Array auf eine Zahl durchsuchen Java Basics - Anfänger-Themen 15
bensdt Klasse erweitern um eine Methode "void decrement()" Java Basics - Anfänger-Themen 5
S Datenbank Tabelle eine Zeile an einer bestimmten Stelle einfügen Java Basics - Anfänger-Themen 2
X Nach einem Bruch testen ob es eine ganze Zahl ist Java Basics - Anfänger-Themen 6
B Von Array nur eine bestimmte Anzahl bekommen Java Basics - Anfänger-Themen 3
C "HelloWorld" - Dateien erstellt, aber ist es eine class-Datei? Java Basics - Anfänger-Themen 2
L Muss eine HttpURLConnection geschlossen werden? Java Basics - Anfänger-Themen 2
D OOP- Eine Klasse in mehrere Klassen aufteilen Java Basics - Anfänger-Themen 7
V Erste Schritte Eine Array-Variable mit Benutzereingaben befüllen Java Basics - Anfänger-Themen 3
N Eine Zahl solange teilen bis es nicht möglich ist und die Ergebnisse ausgeben Java Basics - Anfänger-Themen 23
O Ziehen im Array um einen Schritt in eine einzige beliebige Richtung Java Basics - Anfänger-Themen 5
E Kreis soll eine Raupe darstellen Java Basics - Anfänger-Themen 37
P Alles eine Typfrage Java Basics - Anfänger-Themen 7
B Eine ganze Zahl zerlegen. Java Basics - Anfänger-Themen 4
I Klassen Eine ArrayList<Long>, die sich automatisch sortiert Java Basics - Anfänger-Themen 20
D Guten Tag mache gerade eine Umschulung zum FiSi war leider jetzt 2 Wochen Krank und wir hatten Prozendurale Programmierung. Java Basics - Anfänger-Themen 3
L Iterieren über eine CSV Datei Java Basics - Anfänger-Themen 7
W Zwei Programme sollen auf eine Klasse zugreifen Java Basics - Anfänger-Themen 18
V Wie wiederhole ich eine for-Schleife beim erreichen eines Wertes Java Basics - Anfänger-Themen 9
A Kann man eine Methode als Variable speichern und danach noch verändern? Java Basics - Anfänger-Themen 6
L Klassen Wie “installiert” man eine Klasse? Java Basics - Anfänger-Themen 2
E Datentypen Einfügen von Objekten in eine Map Java Basics - Anfänger-Themen 2
X Wo steht, ob eine Datei big, little oder bi-endian codiert ist? Java Basics - Anfänger-Themen 3
N Bewegtes Objekt soll sich um eine Parallele bewegen Java Basics - Anfänger-Themen 0
O Iterator für eine geordnete Menge Java Basics - Anfänger-Themen 134
J Lesen und schreiben in eine Datei(Anfänger- Dateizugriffe) Java Basics - Anfänger-Themen 3
M Wie lang eine Funktion/Methode? Java Basics - Anfänger-Themen 51
R Warnung, wenn eine Variable eingegeben wird Java Basics - Anfänger-Themen 6
D Richtig Vorbereiten auf eine Programmier Klausur Studium. Java Basics - Anfänger-Themen 7
A Eine Krone in der Textausgabe - Mein Code Java Basics - Anfänger-Themen 11
scratchy1 Kann man in einer Methode eine andere aufrufen? Java Basics - Anfänger-Themen 2
B CSS Klassen in eine Liste schreiben Java Basics - Anfänger-Themen 4
L Klassen Kann eine Unterklasse einer abstrakten Klasse ein Interface implementieren? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Anzeige

Neue Themen


Oben