Variablen fast identische Setter

thomasch

Mitglied
Hallo,
ich habe eine Klasse(Bean), in der ich verschiedene Variablen setzen muss. Diese Variablen müssen alle auf den selben Wertebereich getestet werden.

Momentan sieht das vereinfacht so aus:
Java:
public class MyClass{
    private boolean success=true;
    private final int FOO = 123;
    private int fdo;
    private int fbu;
    // es folgen diverse weitere private int...

   /**
    * testet den Wertebereich eines Farbwertes
    * @param col
    * @return true, wenn Wertebereich passt, sonst false
    */
   private boolean checkColorVal(int col){
      if(
           (col<0)||
           (col>FOO)
        ){
         return false;
      }else{
         return true;
      }
   }

    /**
    * Setter für fbu
    * @param fbu 
    */
  public void setFbu(int fbu) {
      if(this.checkColorVal(fbu)){
         this.fbu = fbu;
      }else{
         this.success=false;
      }
   }

   /**
    * Setter für fdo
    * @param fdo 
    */
   public void setFdo(int fdo) {
      if(this.checkColorVal(fdo)){
         this.fdo = fdo;
      }else{
         this.success=false;
      }
   }
}

Ich hab mir jetzt gedacht, dass man die Setter eigentlich zusammenfassen könnte. Mir schwebt etwas in der Art wie
Java:
...

   private void setCol(int colVar,int colVal){
      if(this.checkColorVal(colVal)){
         colVar = colVal;
      }else{
         this.success=false;
      }
   }
und
Java:
   /**
    * Setter für fbu
    * @param fbu 
    */
   public void setFbu(int fbu) {
      this.setCol(this.fbu, fbu);
   }
vor. Dazu müsste ich die Variablen by reference übergeben - wobei die leider primitive sind und ich annehme, dass mit hier die Verwendung von Integer statt int nicht weiter helfen dürfte...

Habt Ihr eine Idee?

Vielen Dank

Thomasch
 
J

JohannisderKaeufer

Gast
Was hat es mit dem boolean success auf sich?

Eine Möglichkeit ist das du keine int Werte in deiner Bean verwendest, sondern ein Objekt und statt dem success Exceptions wirfst.

Java:
public class ColorValue{
private int value;
public void setValue(int value) throws ValueOutOfRangeException {
  if(value>0 && value < F00){
     this.value = value;
  }else{
    throw new ValueOutOfRangeException();
  }
}
public getValue(){return this.value;}
}
 
B

bygones

Gast
solange nach aussen hin du die noetigen setters getrennt haelst find ichs ok. Intern die private anzubieten, die dir duplicated code erspart ist an sich eine gute idee.

Nur
Java:
private void setCol(int colVar,int colVal){
      if(this.checkColorVal(colVal)){
         colVar = colVal;
      }else{
         this.success=false;
      }
   }
ist nonsense... warum brauchst du colVar 2x ? [c]colVar=colVar[/c] bringt gar nix - aber das hast du schon selbst gesehen....

nein Integer wuerde dir auch nix bringen. Auch dass deine Methode unterschiedliche Wege geht (mal wird das int gesetzt, mal ein boolean) ist nicht hilfreich.

somit seh ich erstmal keine moegliche verbesserung hier (jdf nicht eine die sinnvoll ist)
 

tfa

Top Contributor
Dass ich nicht 2 sondern eigentlich 6 oder 7 habe und jedesmal fast den selbn Code ausführe...

Das ist nichts schlimmes. Du kannst deine IDE die Getter und Setter automatisch erzeugen lassen, ganz wie du willst (Code-Templates). Unschön finde ich hier, dass einfach nur ein Flag gesetzt wird, wenn die Parameterprüfung fehl schlägt. Wie wär's mit IllegalArgumentException?
 
B

bygones

Gast
Dass ich nicht 2 sondern eigentlich 6 oder 7 habe und jedesmal fast den selbn Code ausführe...

solche "optimierungen" sind der tod fuer deine API. wie gesagt - was du intern fuer dich machst ist deine sache.

Wenn du wirklich eine Klasse hast die 6 oder 7 setter braucht, so braucht sie das. Ueberleg eher ob du alle setter brauchst oder ob deine Struktur richtig ist. Ein solches Monster in einen Schafspelz von nur 2 Methoden zu verstecken ist nur eine verschleierung und keine loesung
 

thomasch

Mitglied
Was hat es mit dem boolean success auf sich?

Eine Möglichkeit ist das du keine int Werte in deiner Bean verwendest, sondern ein Objekt und statt dem success Exceptions wirfst.

Java:
public class ColorValue{
private int value;
public void setValue(int value) throws ValueOutOfRangeException {
  if(value>0 && value < F00){
     this.value = value;
  }else{
    throw new ValueOutOfRangeException();
  }
}
public getValue(){return this.value;}
}
Die Klasse soll letztendlich alle übergebenen Variablen auf ihre Wertebereiche testen. Wenn auch nur ein Test fehlschlägt kann ich eh nicht weiter arbeiten und muss darauf reagieren.

Unter anderem werde da noch Koordinatenbereiche und Stringwerte getestet.

Ich hab mir jetzt noch eine Möglichkeit überlegt, die ich aber auch blos nicht wirklich umsetzen möchte:
Java:
   private void setColDoof(int colVal,String name){
      //int colVar;
      
      if(this.checkColorVal(colVal)){
         if(name.equals("fdo")){
            this.fdo=colVal;
         }else if (name.equals("fli")){
            this.fli=colVal;
         }
         // usw.
      }else{
         this.success=false;
      }
   }
 
J

JohannisderKaeufer

Gast
Die Klasse soll letztendlich alle übergebenen Variablen auf ihre Wertebereiche testen. Wenn auch nur ein Test fehlschlägt kann ich eh nicht weiter arbeiten und muss darauf reagieren.

Dann ist das mit dem success auch Kokolores. Wenn ein Setter nicht aufgerufen wird hast du dort einen Null-Wert und trotzdem noch true.

Was mir zu dem Thema einfällt ist das Builder Pattern, das Joshua Bloch beschreibt, wobei dann beim aufruf von build alles nochmal überprüft wird.
 

bERt0r

Top Contributor
Eine Möglichkeit wäre, deine Variablen in einer HashMap zu speichern, sind schließlich alles Farben oder? Dann machst du ein mapping HashMap<String,Color> wobei der String der Variablenname und Color die Variable ist. Der Zugriff auf eine Hashmap ist ziemlich performant, ein Konstrukt wie du oben beschrieben hast bremst bei mehreren Variablen (und damit if abfragen) ziemlich aus und ist extrem ineffizient.
if(this.checkColorVal(colVal)){
if(name.equals("fdo")){
this.fdo=colVal;
}else if (name.equals("fli")){
this.fli=colVal;
}

edit: Ich hab grade gesehen dass du ja ein Bean schreibst, bei Beans musst du natürlich für jede Variable eine get/set Methode schreiben, sonst ists kein Bean
 
Zuletzt bearbeitet:

thomasch

Mitglied
Hallo,
ich hab das jetzt gelöst, in dem die Testroutine einfach einen int zurück gibt.

Java:
private int setCol(int colVar,int colVal){
      int ret=-1;
      if(this.checkColorVal(colVal)){
         ret = colVal;
      }else{
         this.success=false;
      }
      return ret;
   }
 
N

nillehammer

Gast
Wenn Du eine Validierung ausbauen willst, nutze das Bean Validation Framework.

// Uups hab grad gesehen, dass der von Dir gepostete Code ja garnicht der public setter ist. Deswegen hab ich meinen Beitrag mal etwas verkürzt
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Best Practice Code Refactoring für Methoden mit fast gleicher Aufbau Java Basics - Anfänger-Themen 6
D Wenn ich repaint(); mache, flackert es so stark, das man fast nichts erkennen kann. Java Basics - Anfänger-Themen 11
J Methoden Zwei Methoden die fast das gleiche tun organisieren Java Basics - Anfänger-Themen 3
F Alle DEMOS fast veraltet...? Java Basics - Anfänger-Themen 13
Z Speichern in eine .txt klappt.. fast Java Basics - Anfänger-Themen 23
E Projekt fast fertig, nur es läuft nicht ;) Java Basics - Anfänger-Themen 7
0x7F800000 fail-fast Iteratoren nerven gewaltig Java Basics - Anfänger-Themen 18
D Kann noch fast nichts, funktioniert auch fast nichts! Java Basics - Anfänger-Themen 8
Gama 2 (fast) gleiche Dateien - nur eine funktioniert Java Basics - Anfänger-Themen 2
P Welches Buch ist für Einsteiger(fast) ohne Vorwissen passend Java Basics - Anfänger-Themen 7
G ActionListener fast fertig Java Basics - Anfänger-Themen 7
N Mittelwert (fast fertig, nur noch 2 fehler ;-) ) Java Basics - Anfänger-Themen 14
Q Besitzen zwei Strings identische Buchstaben, nur in anderer Reihenfolge? Java Basics - Anfänger-Themen 10
R Methoden Entferne alle identische Knoten (Typ String) aus verkettete Liste Java Basics - Anfänger-Themen 8
S Parameterübergabe - identische Funktionen, aber falsche Funktion Java Basics - Anfänger-Themen 5
I If / Else in Setter? Java Basics - Anfänger-Themen 8
T Getter/Setter - wie sieht ein Setter aus? Und wie nicht? Java Basics - Anfänger-Themen 34
M Methoden Zweidimensionaler Array mit Setter Methode ändern Java Basics - Anfänger-Themen 4
H Mit setter-Methode JLabel in einer andern Klasse ändern. Java Basics - Anfänger-Themen 40
W Getter/Setter Java Basics - Anfänger-Themen 4
C Setter-Methode mit final-Attribut Java Basics - Anfänger-Themen 9
KogoroMori21 Objektvariable anderer Klasse übernehmen, Getter/Setter Java Basics - Anfänger-Themen 11
T Verständnisfrage Objekt Getter Setter Java Basics - Anfänger-Themen 102
KogoroMori21 Getter und Setter Java Basics - Anfänger-Themen 5
S Klassen instanziieren und verwenden von Getter und Setter Java Basics - Anfänger-Themen 4
P Klasse hat keinen Zugriff auf getter/setter-Methoden eines Objektes Java Basics - Anfänger-Themen 9
M Gettter/Setter Methoden Klassenfelder kapselung und zugriff? Java Basics - Anfänger-Themen 1
V getter/setter Garage Java Basics - Anfänger-Themen 12
S getter, setter in abstrakter Klasse oder lieber Unterklassen Java Basics - Anfänger-Themen 4
topi Kapselung getter und setter Java Basics - Anfänger-Themen 5
D Setter/Getter für Instanzvariablen praktisch? Java Basics - Anfänger-Themen 19
S Getter/Setter - Variablenklasse ? Java Basics - Anfänger-Themen 5
S getter and setter Java Basics - Anfänger-Themen 12
L Getter und Setter Java Basics - Anfänger-Themen 2
JavaTalksToMe Kapselung Setter Frage Java Basics - Anfänger-Themen 15
M Generics getter und setter Methoden Java Basics - Anfänger-Themen 4
E Methoden Objekte in Methode aufrufen ohne getter und setter? Java Basics - Anfänger-Themen 1
kilopack15 Ist diese setter-Methode richtig? Java Basics - Anfänger-Themen 2
L Klassen - Getter & Setter Methoden Java Basics - Anfänger-Themen 2
D Erste Schritte Java - Setter und Getter Java Basics - Anfänger-Themen 1
T setter im Konstruktor einbauen? Java Basics - Anfänger-Themen 8
Z Getter/Setter NullPointer Exception Java Basics - Anfänger-Themen 6
K Klassen Setter/Getter Java Basics - Anfänger-Themen 3
F OOP Schleifen und Probleme mit Setter und Getter Java Basics - Anfänger-Themen 1
L Setter und Getter/Vererbung Java Basics - Anfänger-Themen 6
K Kapselung getter & setter Java Basics - Anfänger-Themen 11
F Setter Java Basics - Anfänger-Themen 4
gamebreiti Problem mit Setter in Superklasse Verkettung der Kostruktoren??? Java Basics - Anfänger-Themen 7
J Frage zu Setter u. Getter Java Basics - Anfänger-Themen 7
T Variablen Getter-Setter vs Public Variable? Java Basics - Anfänger-Themen 5
Y Konstruktor - Setter/Getter Java Basics - Anfänger-Themen 3
N Setter funktioniert nicht Java Basics - Anfänger-Themen 6
N Klassen fragen zur getter und setter methode Java Basics - Anfänger-Themen 11
D Ab wann getter und setter Java Basics - Anfänger-Themen 2
K getter & setter Java Basics - Anfänger-Themen 6
M Methoden Problem bei Setter. Java Basics - Anfänger-Themen 2
C getter/setter Problem anscheinend Java Basics - Anfänger-Themen 13
G Erste Schritte Getter und Setter Java Basics - Anfänger-Themen 12
S setter Java Basics - Anfänger-Themen 9
B Getter,Setter - Konstruktor überflüssig? Java Basics - Anfänger-Themen 26
N Sprite Methode (Getter, Setter, Konstruktor) Java Basics - Anfänger-Themen 9
S getter/setter aufrufen Java Basics - Anfänger-Themen 9
B Java getter/setter funktioniert nicht! Java Basics - Anfänger-Themen 7
X OOP Getter/Setter überschreiben den Wert ihrer Variablen nicht Java Basics - Anfänger-Themen 4
S Ein Attribut/Instanz eines bestehendes Objektes mit SETTER Methode ändern Java Basics - Anfänger-Themen 3
T Erste Schritte Verständnisfrage: Getter und Setter Methoden Java Basics - Anfänger-Themen 3
S Setter Methode von Boolean Java Basics - Anfänger-Themen 11
V public Variablen vs Getter + Setter Java Basics - Anfänger-Themen 4
F Getter und Setter Java Basics - Anfänger-Themen 4
lulas[]args getter/setter umstellung Java Basics - Anfänger-Themen 6
propra Gegenteil von Setter-Methoden Java Basics - Anfänger-Themen 30
T Setter Methode Wertebereich eingrenzen Java Basics - Anfänger-Themen 5
F Setter-Methode bei double-Array Java Basics - Anfänger-Themen 6
A Setter verschachteln? Java Basics - Anfänger-Themen 4
D Kapselung override Setter Java Basics - Anfänger-Themen 5
B Klassen Getter-Setter vor neuem Klassenaufruf - wie? Java Basics - Anfänger-Themen 20
H OOP Setter im Konstruktor um code nicht zu wiederholen? Java Basics - Anfänger-Themen 2
N OOP Getter, Setter und andere Probleme Java Basics - Anfänger-Themen 8
A OOP Getter und Setter Java Basics - Anfänger-Themen 18
L Unterschied Konstruktor / Getter Setter Java Basics - Anfänger-Themen 13
L Setter und Getter für Arrays? Java Basics - Anfänger-Themen 4
N boolean bei Setter und getter methoden Java Basics - Anfänger-Themen 21
N immer Setter-Methoden verwenden? Java Basics - Anfänger-Themen 54
J Getter und Setter auch intern benutzen - guter Stil? Java Basics - Anfänger-Themen 31
U Problem mit setter Java Basics - Anfänger-Themen 17
Houly Setter/Getter MEthoden testen Java Basics - Anfänger-Themen 4
P OOP Getter&Setter Methoden funktionieren nicht Java Basics - Anfänger-Themen 7
S Setter bei Variablen Java Basics - Anfänger-Themen 6
R Enum und dann setter Setzen? Java Basics - Anfänger-Themen 44
H Setter-und-Getter-Konvention Java Basics - Anfänger-Themen 8
V Reflection API - getter und setter Java Basics - Anfänger-Themen 7
-horn- EINE setter/getter klasse aus mehreren klassen befüllen Java Basics - Anfänger-Themen 13
C Getter/Setter Java Basics - Anfänger-Themen 61
H Frage zu getter und setter Java Basics - Anfänger-Themen 5
G [Hibernate] Could not find a setter for property Java Basics - Anfänger-Themen 2
S Unbenutzte/überflüssige Getter/Setter herausfinden? Java Basics - Anfänger-Themen 2
M getter/setter bei JTextField ? Java Basics - Anfänger-Themen 21
G warum Setter/Getter Java Basics - Anfänger-Themen 25
S In einer Liste auf getter und setter zugreifen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben