Setter/Getter für Instanzvariablen praktisch?

Dibelius

Mitglied
Back to basics...

Gibt es in Java einen praktischeren Weg für Getter und Setter, als der klassiche Umweg über Methodenaufrufe? Mich stören oft die vielen Klammern, weshalb der Code schnell mal unleserlich wird.
Java:
class Test
{
   private int count

   public void setCount(int v) {
      this.count = (v >= 0) ? v : 0;
   }

   public int getCount() {
      return this.count;
   }
}

// Aufruf aus anderer Klasse
   int newCount = testinstanz.getCount();
   testinstanz.setCount(10);
In ActionScript (und vielleicht auch in einigen anderen Script-/Programmiersprachen) gab es dafür eine elegante Lösung mittels spezieller Getter- und Setter-Methoden:
Code:
   private var count :int;
   public function set count(v:int):void { ... }
   public function get count():int { ... }

// Aufruf aus anderer Klasse
   int newCount = testinstanz.count; // getter
   testinstanz.count = 10; // setter

Mir gefällt bei diesem Ansatz die Klarheit. Das private Feld bleibt privat und somit geschützt, der eigentliche Zugriff erfolgt über die speziellen Methoden. Insbesondere beim Setter finde ich die Syntax sehr angenehm mittels Zuweisungsoperator.
 
X

Xyz1

Gast

temi

Top Contributor
Gibt es in Java einen praktischeren Weg für Getter und Setter, als der klassiche Umweg über Methodenaufrufe?
Nicht das ich wüsste. Getter und Setter sind der richtige Weg, sollten aber dennoch (insbesondere Setter) sparsam eingesetzt werden, weil sie eine direkte Veränderung des Objektzustands ermöglichen. Das ist meist nicht erwünscht. Eine Klasse sollte soviel Information verbergen, wie möglich.
Zustandsänderungen erfolgen i.d.R. über eine Aktion im Zusammenhang mit dem Objekt. Bei einem Feld "count" wäre z.B. denkbar, dass der Zähler inkrementiert wird, wenn eine Aktion "add(...)" durchgeführt wird und dekrementiert wird bei "remove(...)".
 

Dibelius

Mitglied
Danke an #3 und #4 :)

Mein bescheidenes Ziel ist eigentlich nur, einem potentiellen Anwender meiner Hauptklasse eine bequeme Instanz-Manipulation zu ermöglichen, wo es sinnvoll erscheint.
Java:
MainClass main = new MainClass();
main.array = new int[]{1,2,3};
main.amount = 3;
main.doSomethingWithCurrentValues();
Das Feld 'count' war nicht das beste Beispiel. Konkret müsste es 'amount' heißen, weil ich eine Anzahl an Schleifendurchläufen festlegen möchte. Das kann/möchte ich weder im Konstruktor tun, noch bei der letzten Methode als Argument mitliefern. An der Stelle denke ich vielleicht noch zu wenig in JAVA, und mir ist klar, dass wenig dafür sprechen mag, die nötigen Argumente nicht direkt mitzuliefern, dort, wo sie benötigt werden. Es gibt ja einen Standardwert, womit gearbeitet wird, wenn nicht explizit der 'amount'-Wert überschrieben wird. Aus dem Grund möchte ich auch den Methodenaufruf nicht von vornherein mit Parametern überfrachten (und auch überladene Methoden sparsam einsetzen).

Lange Rede, kurzer Sinn:
Ich habe es jetzt für mich so gelöst, dass ich den Zugriff, wie im oberen Beispiel direkt mit public-Feldern gestatte und der Verwender der Klasse erst einmal alles mögliche angeben kann. Die Validierung, ob der Wert tatsächlich sinnvoll ist, erfolgt dann in der oder den Methoden, wo die Variable zum Einsatz kommt an Ort und Stelle. Ein simples Beispiel:
Java:
package x.y.z

public class MainClass
{
   int amount = 5;

   public void doSomethingWithCurrentValues() {
      // Wert mit lokaler Methode bereinigen
      this.validateAmount(this.amount);

      // paket-internes Verwaltungsobjekt für klassenübergreifende Verwendung
      packageDataObject.validateAmount(this.amount);
   }

   private void validateAmount(int value) {
      this.amount = value < 0 ? 0 : (value > 10 ? 10 : value);
   }
}

Java:
package x.y.z

class PackageData
{
   int amount; // in anderen Paket-Klassen wird nur mit diesem Wert gearbeitet

   void validateAmount(int value) {
      this.amount = value < 0 ? 0 : (value > 10 ? 10 : value);
   }
}
Das ist sicher etwas umständlich gedacht, aber mir sind die Manipulation und der Zugriff so lieber.
Nur für den Getter habe ich keine passende Lösung anzubieten, wobei mir das für die paketinterne Verwendung weniger wichtig ist.
 

Dibelius

Mitglied
Es funktioniert und vereinfacht die Verwendung der Hauptklasse.
Darum ging es mir.
Ob sinnvoll oder nicht... worin genau liegt Dein Problem mit meinem Lösungsansatz?

Ich zitiere:
"schönen Abend noch."
 

Goldi

Aktives Mitglied
Der Grund warum Setter unverzichtbar und eine klasse Lösung sind ist ganz einfach: In einen 12-Liter-Wasserkübel passen nun mal keine 25 Liter Wasser (siehe nachfolgender Code). Es geht um Typsicherheit, Konsistenz, Ausschalten von Fehlerquellen bei der Verwendung Deiner Klasse mit public-Eigentschaften. Ich finde es weniger umständlich, mehr genial und top leserlich - letzteres ist dann wohl Geschmackssache. Bei der professionellen Programmierung (wo oft mehrere beteiligt sind) geht's aber viel mehr um einheitliche Sprachkonventionen als um Geschmack. Hier der Wasserkübel zur Veranschaulichung von Fehlerquellen:

Java:
public class Wasserkuebel {
   
    // Das Fassungsvermögen eines Wasserkübels defniert sich aus Radius bzw.
    // Durchmesser und Höhe. Der Radius ist fest vorgegeben, die Höhe verstellbar:
   
    public final double radius = 20.0;   // Radius = 20 cm
    public double hoehe;
    private double wassermenge = 0.0;     // Wassermenge im Kübel in Liter
   
    /** @param hoehe Küble-Höhe in cm */
    public Wasserkuebel(double hoehe) {
        this.hoehe = hoehe;
    }
   
    public double getVolumenLiter() {
        return Math.PI * radius * radius * hoehe / 1000.0;
    }
   
    public void fuelleWasserEin(double liter) {
        liter = liter < 0.0 ? 0.0 : liter;
        if (wassermenge + liter > getVolumenLiter()) {
            wassermenge = getVolumenLiter();    // Mehr passt nicht rein.
        } else {
            wassermenge += liter;
        }
    }
   
    /** Höhe wird neu gesetzt.
     * @param hoehe Neue Höhe des Wasserkübels in cm*/
    public void setHoehe(double hoehe) {
        this.hoehe = hoehe;
        if (wassermenge > getVolumenLiter()) {
            // Bei einer Verkleinerung wird u. U. Wasser verschüttet:
            wassermenge = getVolumenLiter();
        }
    }
   
    public void aktuellerStand() {
        System.out.println("Wasserkübel: Fassungsvermögen=" + getVolumenLiter()
            + " l, enthaltene Wassermenge=" + wassermenge + " l");
    }
   
    public static void main(String[] args) {
        Wasserkuebel kuebel = new Wasserkuebel(40d);
        kuebel.fuelleWasserEin(50.0);
       
        // Unterschied von Setter ...
        kuebel.setHoehe(20.0);
        kuebel.aktuellerStand();
            // Ausgabe:
            // Wasserkübel: Fassungsvermögen=25.13274122871835 l, enthaltene Wassermenge=25.13274122871835 l
           
        // ... und direkter Manipulation:
        kuebel.hoehe = 10.0;
        kuebel.aktuellerStand();
            // Ausgabe:
            // Wasserkübel: Fassungsvermögen=12.566370614359174 l, enthaltene Wassermenge=25.13274122871835 l
    }
}
 

Meniskusschaden

Top Contributor
Es funktioniert und vereinfacht die Verwendung der Hauptklasse.
Eigentlich nicht, denn der Verwender wäre ja wohl ein Java-Programmierer und der erwartet natürlich Java-Konventionen - unabhängig davon, ob das nun grundsätzlich etwas besser oder etwas schlechter als das Konzept aus deinem Eröffnungsposting ist.

Der Direktzugriff ohne Methode ist in jedem Fall eine schlechte Wahl.
 

Meniskusschaden

Top Contributor
Ob sinnvoll oder nicht... worin genau liegt Dein Problem mit meinem Lösungsansatz?
Noch ein paar Ergänzungen zum Beitrag von @Goldi: Die ganzen Prüfungen, die @Goldi vorgeschlagen hat, kannst du bei deinem Ansatz nicht mehr nachträglich einbauen, ohne die Schnittstelle deiner Klasse zu ändern.

Du kannst die interne Repräsentation von amount auch nicht mehr ändern, ohne den Benutzer damit zu konfrontieren.

Ausserdem kann der Verwender jetzt nicht schon beim Setzen des Wertes feststellen, dass er ungültig ist, sondern erst später beim Aufruf von doSomething....

Also ein hoher Preis, den man für das Weglassen der ohnehin üblichen Klammern zahlen muß.
 

Dibelius

Mitglied
Ok. Das klingt plausibel, auch was die Java-Konventionen betrifft. Wie gesagt, da denke ich eventuell noch zu sehr in anderen Sprachen, und vermisse den einen oder anderen Komfort, wozu auch optionale Parameter bei Methoden zählen.

Es ist, wie es ist. Ohne entsprechende Sprachelemente ist das so wie von mir gehofft, nicht umsetzbar.
 

mrBrown

Super-Moderator
Mitarbeiter
Wie gesagt, da denke ich eventuell noch zu sehr in anderen Sprachen, und vermisse den einen oder anderen Komfort, wozu auch optionale Parameter bei Methoden zählen.

Ich persönlich finde ein:
Java:
MainClass main = new MainClass();
main.array = new int[]{1,2,3};
main.amount = 3;
main.doSomethingWithCurrentValues();

deutlich umkomfortabler als:

Java:
MainClass main = new MainClass(new int[]{1,2,3}, 3);
main.doSomethingWithCurrentValues();

oder auch die Flutent-Interface-Variante, völlig unabhängig von der Sprache.


Optionale Parameter kann man rudimentär mit Überladen oder null lösen, wobei das natürlich nicht so schön wie in anderen Sprachen ist...
 

Goldi

Aktives Mitglied
[...] und vermisse den einen oder anderen Komfort, wozu auch optionale Parameter bei Methoden zählen.

Denkst Du da an die objektorientierte Supersprache schlechthin mit "Public Sub IchTuWas(ByVal Optional irgendwas As Boolean = False)" - Visual Basic? (Zu meiner Ehrenrettung: Das war Sarkasmus :D) ... sorry. Im Ernst: Schlag mal (im Java-Kontext) unter "überladen" nach. Ist das der Komfort von optionalen Parametern, den Du suchst?
 

Dibelius

Mitglied
Bist du eigentlich eine Frau?
Bist Du eigentlich ein Forentroll? Tourette?

Vielleicht wäre ja ein Fluent-Interface was für dich?
Das sieht in der Tat interessant aus. Danke!

Ich persönlich finde ein (...) deutlich umkomfortabler (...)
Ja, und Nein. Mein Gedanke war: Keep it simple. Da möchte ich den Benutzer, der die Hauptklasse instanziiert, nicht mit zu viel "Vorarbeit" überfrachten und diese auch nur verlangen, wenn andere Verhaltensweisen vom Objekt gewünscht sind, als die Standardinitialisierungen bestimmter Felder es vorgeben.

Der Code könnte schlicht lauten:
Java:
MainClass main = new MainClass();
//main.array = new int[]{1,2,3};
//main.amount = 3;
main.doSomethingWithCurrentValues(); // arbeitet nun mit Standardwerten für 'array' und 'amount'

Optionale Parameter kann man rudimentär mit Überladen oder null lösen, wobei das natürlich nicht so schön wie in anderen Sprachen ist...
Genau. Rudimentär. Mir ist das Konzept von überladenen Methoden bekannt, und offensichtlich ist das der Weg, den Java-Entwickler gehen (müssen).
 

mrBrown

Super-Moderator
Mitarbeiter
Ja, und Nein. Mein Gedanke war: Keep it simple. Da möchte ich den Benutzer, der die Hauptklasse instanziiert, nicht mit zu viel "Vorarbeit" überfrachten und diese auch nur verlangen, wenn andere Verhaltensweisen vom Objekt gewünscht sind, als die Standardinitialisierungen bestimmter Felder es vorgeben.
Das würde man dann mit überladenen Methoden (bei wenigen, unterschiedlichen Parametern) oder Builder-Pattern lösen (wenns die Parameter komplexer werden), letzteres entspricht dann dem Fluent-Interface.

Hat beides auch den Vorteil, dass man immutable Objekte hat
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Setter und Getter für Arrays? Java Basics - Anfänger-Themen 4
T Getter/Setter - wie sieht ein Setter aus? Und wie nicht? Java Basics - Anfänger-Themen 34
W Getter/Setter Java Basics - Anfänger-Themen 4
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
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
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
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
L Klassen - Getter & Setter Methoden Java Basics - Anfänger-Themen 2
D Erste Schritte Java - Setter und Getter Java Basics - Anfänger-Themen 1
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
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 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
C getter/setter Problem anscheinend Java Basics - Anfänger-Themen 13
G Erste Schritte Getter und Setter Java Basics - Anfänger-Themen 12
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
T Erste Schritte Verständnisfrage: Getter und Setter Methoden Java Basics - Anfänger-Themen 3
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
B Klassen Getter-Setter vor neuem Klassenaufruf - wie? Java Basics - Anfänger-Themen 20
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
N boolean bei Setter und getter methoden Java Basics - Anfänger-Themen 21
J Getter und Setter auch intern benutzen - guter Stil? Java Basics - Anfänger-Themen 31
Houly Setter/Getter MEthoden testen Java Basics - Anfänger-Themen 4
P OOP Getter&Setter Methoden funktionieren nicht Java Basics - Anfänger-Themen 7
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
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
I If / Else in Setter? Java Basics - Anfänger-Themen 8
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
C Setter-Methode mit final-Attribut Java Basics - Anfänger-Themen 9
M Gettter/Setter Methoden Klassenfelder kapselung und zugriff? Java Basics - Anfänger-Themen 1
JavaTalksToMe Kapselung Setter Frage Java Basics - Anfänger-Themen 15
kilopack15 Ist diese setter-Methode richtig? Java Basics - Anfänger-Themen 2
T setter im Konstruktor einbauen? Java Basics - Anfänger-Themen 8
F Setter Java Basics - Anfänger-Themen 4
gamebreiti Problem mit Setter in Superklasse Verkettung der Kostruktoren??? Java Basics - Anfänger-Themen 7
N Setter funktioniert nicht Java Basics - Anfänger-Themen 6
M Methoden Problem bei Setter. Java Basics - Anfänger-Themen 2
S setter Java Basics - Anfänger-Themen 9
S Ein Attribut/Instanz eines bestehendes Objektes mit SETTER Methode ändern Java Basics - Anfänger-Themen 3
S Setter Methode von Boolean Java Basics - Anfänger-Themen 11
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
T Variablen fast identische Setter Java Basics - Anfänger-Themen 14
H OOP Setter im Konstruktor um code nicht zu wiederholen? Java Basics - Anfänger-Themen 2
N immer Setter-Methoden verwenden? Java Basics - Anfänger-Themen 54
U Problem mit setter Java Basics - Anfänger-Themen 17
S Setter bei Variablen Java Basics - Anfänger-Themen 6
R Enum und dann setter Setzen? Java Basics - Anfänger-Themen 44
G [Hibernate] Could not find a setter for property Java Basics - Anfänger-Themen 2
Say Class scope und Instance scope und Getter nur selbstgeschrieben Methoden Java Basics - Anfänger-Themen 11
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
O Instanzattribut per Getter Methode zuweisbar, warum? Java Basics - Anfänger-Themen 8
P Klassenübergreifende Ausgabe mittels "getter" nicht möglich Java Basics - Anfänger-Themen 21
J Array über Getter erlangen Java Basics - Anfänger-Themen 34
M Getter einer PriorityQueue Java Basics - Anfänger-Themen 1
KopaCoda Getter mehrfach aufrufen -> ist das guter code? Java Basics - Anfänger-Themen 3
V Getter Methode Java Basics - Anfänger-Themen 38
T Extrahiertes Objekt durch Getter bekommen Java Basics - Anfänger-Themen 2
D Kapselung final Variablen mit Getter? Java Basics - Anfänger-Themen 2
A getter Java Basics - Anfänger-Themen 3
T Getter für Array Java Basics - Anfänger-Themen 4
J-Gallus Ein Getter bekommt eine anderen Type als er Return soll Java Basics - Anfänger-Themen 9
K Public Attribute oder getter - funktioniert leider beides hier nicht Java Basics - Anfänger-Themen 5
P getter Java Basics - Anfänger-Themen 1
M Getter Problematik mit ItemListener Java Basics - Anfänger-Themen 17

Ähnliche Java Themen

Neue Themen


Oben