Im Konstruktor mit Settern auf private Attribute zugreifen - oder nicht?

fuulf

Mitglied
Hallo,

ich würde gerne wissen, welcher der beiden folgenden Implementierungen besser ist:


Variante 1:

Java:
public class MyClass {
  MyClass(int start) {
    setMember(start);
  }
  
  public void setMember(int value) {
    member = value;
  }

  public int getMember() {
    return member;
  }
  
  private int member;
}

Variante 2:

Java:
public class MyClass {
  MyClass(int start) {
    member = start;
  }
  
  public void setMember(int value) {
    member = value;
  }

  public int getMember() {
    return member;
  }
  
  private int member;
}

Die selbe Frage stellt sich dann nochmal für Methoden der Klasse. Allgemein frage ich mich also: sollte man auch innerhalb der eigenen Klasse mit Settern und Gettern auf private Eigenschaften zugreifen?


Viele Grüße
 
G

Gast2

Gast
Innerhalb einer Klasse finde ich es nicht soo wichtig die Daten über setter zu manipuilieren. Wenn man seiner eigenen Klasse schon nicht traut, wem dann ;)

Im Konstruktor mit Settern auf private Attribute zugreifen - oder nicht?
Wie gesagt siehe oben. Wobei man bei Konstruktoren darauf achten sollte dass man ausschließlich Methoden aufruft die final sind, ansonsten kannst du Probleme bei abgeleiteten Klassen bekommen.
 

fuulf

Mitglied
Vielen Dank schonmal :)

Wir wurden halt ziemlich eindringlich auf die Wichtigkeit von Daten-Kapselung hingewiesen, da dachte ich schon...




Wobei man bei Konstruktoren darauf achten sollte dass man ausschließlich Methoden aufruft die final sind, ansonsten kannst du Probleme bei abgeleiteten Klassen bekommen.

Das ist so, weil sonst die aufgerufenen Methoden überschrieben werden können, was den Konstruktor ruinieren könnte?


Viele Grüße
 
Zuletzt bearbeitet:

Illuvatar

Top Contributor
Was für Variante 1 sprechen würde:
Der Zugriff über getter/setter kann ja eventuell später einmal nützlich sein, wenn man die Menge der gültigen Parameter einschränken möchte, also z.B. im setter noch ein [c]if (value >= 0)[/c] einbaut.
Wenn man Variante 1 verwendet, muss man diesen Check dann eventuell nicht auch noch im Konstruktor einbauen (dort sollen ja vermutlich dann auch keine ungültigen Werte übergeben werden können).
 
G

gassssssst

Gast
Ich würde es so machen, so hast du nämlich auch tatsächlich Datenkapselung, im Gegensatz zu deinen beiden Varianten:

Java:
public class MyClass {
  private int member;

  MyClass(int start) {
    member = start;
  } 
}
 
G

Gast2

Gast
Das ist so, weil sonst die aufgerufenen Methoden überschrieben werden können, was den Konstruktor ruinieren könnte?
Das ist ein Grund. Aber es gibt noch nen gravierenden Grund:
Der Konstruktor der Oberklasse wird vor dem Konstruktor der Subklasse aufgerufen. Wenn du jetzt aus dem Oberklassenkonstruktor eine Methode der Subklasse aufrufst wird diese VOR dem Konstruktor der Subklasse aufgerufen und du kannst falsch Werte erhalten.

Hier nen Beispiel:
Java:
public class ConstructorDemo {

	public static void main(String[] args) {
		new Subclass(42);
	}
	
	abstract static class Parent {
		Parent() {
			int i = getTheValue();
			System.out.println(i);
		}
		
		abstract int getTheValue();
	}
	
	private static class Subclass extends Parent {

		private final int value;
		
		Subclass(int value) {
			this.value = value;
		}
		
		@Override
		int getTheValue() {
			return value;
		}
	}
}
Als Ausgabe erhälst du 0, und nicht die erwartete 42.
Das kommt vielleicht nicht allzu oft vor, aber man sollte dran denken wenn man sowas macht.

EDIT:
Viel zu spät :/
 

fuulf

Mitglied
Was für Variante 1 sprechen würde:
Der Zugriff über getter/setter kann ja eventuell später einmal nützlich sein, wenn man die Menge der gültigen Parameter einschränken möchte, also z.B. im setter noch ein if (value >= 0) einbaut.
Wenn man Variante 1 verwendet, muss man diesen Check dann eventuell nicht auch noch im Konstruktor einbauen (dort sollen ja vermutlich dann auch keine ungültigen Werte übergeben werden können).

Also könnte man ja eigentlich schon sagen, dass das Prinzip der Datenkapselung auch innerhalb der Klasse zumindest teilweise greift? (In dem Sinne, dass man nur einmal definieren muss, wie und was man setzen darf und dann immer auf diese Definition zurückgreifen kann)

Also wenn man auf der sicheren Seite sein will (d.h. wenn man Qualität über Bequemlichkeit stellt) sollte man sich generell immer an Variante 1 halten?

Ich sollte auch noch dazu sagen, dass ich bald eine Klausur schreibe. Und da gebe ich im Zweifelsfall lieber den Opportunisten mit der Lehrbuchlösung. Und das wäre dann also Variante 1, oder?


Viele Grüße
 
Zuletzt bearbeitet:

fuulf

Mitglied
Ja, sollten sie. Sind sie in deinem Beispiel aber nicht ;)

Also muss ich mir das ab heute mal angewöhnen! :)

Aber noch mal zu deinem Beispiel, das ich immer noch zu verstehen versuche. Ich dachte am Anfang, es würde damit zusammenhängen, dass value als final deklariert wurde, aber es klappt auch so. (Zeile 18)

Dann habe ich mich gefragt, wo denn überhaupt die 0 her kommt. Ich glaube, das ist so:

Bevor er mit Zeile 20 anfangen kann, muss er bei 8 starten. Und dann ist in Zeile 9 das Problem, dass getTheValue() gebraucht wird, aber nicht da ist. Und da wird dann ohne Fehlermeldung einfach mal so die 0 geholt - und dann auch ausgegeben. Weil value in Zeile 18 als final deklariert wurde, bleibt value auch für immer eine 0, aber hätte man in Zeile 18 auf das final verzichtet, dann würde sich value schon noch auf die 42 ändern, oder?

Also wenn ich das alles richtig verstanden hätte. Wäre das dann nicht ein Verstoß gegen das Prinzip der geringsten Verwunderung. Also ich meine, dann müsste man sich doch fragen: Warum macht Java denn sowas?!


Viele Grüße
 
G

Gast2

Gast
Nein, mit dem final hat das nichts zu tun. Das Problem ist einfach folgendes:

Der Konstruktor von Parent wird VOR dem Konstruktor von Subclass aufgerufen. Im Konstruktor wird getTheValue() aufgerufen (auf der Subklasse) und der Wert von value wird zurückgegeben. Da dort aber noch kein Wert gesetzt wurde wird der default wert zurückgegeben, der ist hier 0. Danach erst wird der Konstruktor von Subclass aufgerufen und
Code:
value
wird auf 42 gesetzt.

Wenn du folgende main verwendest siehst du das auch:
Java:
public static void main(String[] args) {
	Subclass sc = new Subclass(42);
	System.out.println(sc.value);
}
Die Ausgabe ist:
Java:
0
42
 

fuulf

Mitglied
Gut, dann ist das schonmal doch nicht so schlimm von Java, wie ich dachte :)

Aber wäre es nicht trotzdem besser von Java, wenn Java generell den Aufruf einer Methode (wie beim Beispiel getTheValue()) verbietet, wenn zu dem Zeitpunkt noch nicht der Konstruktor der Klasse, in der die Methode definiert wird, aufgerufen worden ist? Oder wenn Java halt eben erst den gebrauchten Konstruktor (hier also den von Subclass) aufrufen würde? Ich meine, Java muss doch merken, dass es sich bei der 0 nur um einen Standardwert handelt, bei dem es äußert fragwürdig erscheint, dass der Programmierer den auch wirklich haben wollte, oder?


Viele Grüße
 
G

Gast2

Gast
Nein das geht nicht. Java hat zur Compilezeit von Parent keinerlei Informationen darüber welche Klassen von Parent ableiten und ob da eventuell Methoden überschrieben werden. Du kannst ja die Basisklasse auch seperat kompilieren und später in nem anderen Projekt Subklassen dazubauen. Bei den IDEs kannst du aber einstellen, dass du ne Warnung bekommst wenn im Konstruktor Methoden aufgerufen werden die nicht final sind.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Null-Pointer trotz Konstruktor? Java Basics - Anfänger-Themen 9
M Konstruktor-Aufruf im Konstruktor, aber nicht am Anfang? Java Basics - Anfänger-Themen 4
T Schlüsselworte Schlüsselwort this im Konstruktor Java Basics - Anfänger-Themen 3
frager2345 Warum muss ich hier im Konstruktor meine Exeption nicht abfangen ? Java Basics - Anfänger-Themen 4
J Konstruktor Java Basics - Anfänger-Themen 18
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
G Welche Attribute kommen in den Konstruktor? Java Basics - Anfänger-Themen 5
M wird der Konstruktor nicht als 1. ausgeführt? Java Basics - Anfänger-Themen 13
G Konstruktor und update Java Basics - Anfänger-Themen 4
K Kopier-Konstruktor Java Basics - Anfänger-Themen 6
S Default Konstruktor Java Basics - Anfänger-Themen 7
M Konstruktor ohne Übergabe eines Wertes Java Basics - Anfänger-Themen 7
M Wie kann ich in einem Konstruktor die Methode eines anderen Interfaces mit den jeweiligen Parametern aufrufen? Java Basics - Anfänger-Themen 8
J Vier gewinnt in Java,Spieler Konstruktor Java Basics - Anfänger-Themen 8
kxrdelis Konstruktor für ein Rechtwinkliges Dreieck Java Basics - Anfänger-Themen 10
Zeppi OOP Bruch kürzen im Konstruktor Java Basics - Anfänger-Themen 2
HorstSchröder Konstruktor mit Initialwert Java Basics - Anfänger-Themen 1
C Konstruktor ab serialisiertem Objekt Java Basics - Anfänger-Themen 4
J Input/Output Konstruktor ergänzen, der zur Datei mit einem Objekt passt Java Basics - Anfänger-Themen 0
InfinityDE Problem mit Datenübergabe an Konstruktor Java Basics - Anfänger-Themen 7
B Konstruktor mit Array als Parameter Java Basics - Anfänger-Themen 3
G Variablen Array Länge über den Konstruktor definieren Java Basics - Anfänger-Themen 4
L Konstruktor für eine Map-Datei/Map-Datei einlesen Java Basics - Anfänger-Themen 5
C Interface und Konstruktor Java Basics - Anfänger-Themen 1
H Generische Konstruktor Java Basics - Anfänger-Themen 12
MiMa Seltsames Verhalten im Konstruktor Java Basics - Anfänger-Themen 6
S Konstruktor passt nicht zum Rest Java Basics - Anfänger-Themen 11
C Unbekannter "Konstruktor"?? Java Basics - Anfänger-Themen 10
W OOP Warenlager mit Array(Konstruktor, Methoden) Java Basics - Anfänger-Themen 39
R Objekt in Konstruktor ist nicht zulässig Java Basics - Anfänger-Themen 5
A Mit einer Methode den Konstruktor aufrufen? Java Basics - Anfänger-Themen 2
B Warum können super() und this() nicht gemeinsam in einem Konstruktor verwendet werden? Java Basics - Anfänger-Themen 7
K Konstruktor für ein Objekt mit Zugriffsmethoden Java Basics - Anfänger-Themen 7
H Unterschied Konstruktor und Klassenname x = new Klassenname; Java Basics - Anfänger-Themen 3
B Klassen Array Parameter im Konstruktor? Java Basics - Anfänger-Themen 4
E Konstruktor mit Methode Java Basics - Anfänger-Themen 7
E ArithmeticException im Konstruktor Java Basics - Anfänger-Themen 4
S Konstruktor, Objekte Java Basics - Anfänger-Themen 4
F Konstruktor richtig implementiert? Frage zu Benutzereingaben... Java Basics - Anfänger-Themen 9
W Typecastin im Konstruktor? Java Basics - Anfänger-Themen 2
A Variablen Variablenwert über Konstruktor ändern Java Basics - Anfänger-Themen 3
F Arrays im Konstruktor Java Basics - Anfänger-Themen 5
C Konstruktor mit und ohne Parameterliste Java Basics - Anfänger-Themen 13
L Instanzvariablen, Veerbung, Konstruktor Java Basics - Anfänger-Themen 32
E Best Practice Konstruktor mit bestehender Intanz der gleichen Klasse aufrufen Java Basics - Anfänger-Themen 4
E Plausibilitätsprüfung in dem Konstruktor mit Ausnahmebehandlung Java Basics - Anfänger-Themen 8
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 7
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 0
D Compiler-Fehler Konstruktor von Superklasse übernehmen Java Basics - Anfänger-Themen 1
P Counter im Konstruktor Java Basics - Anfänger-Themen 11
J toString-Methode in Verbindung mit varArgs-Konstruktor Java Basics - Anfänger-Themen 18
I Einträge in den Konstruktor Java Basics - Anfänger-Themen 3
Aprendiendo [JAVA-Syntax] (int... variable) bei einem Konstruktor Java Basics - Anfänger-Themen 8
J Superklassen Konstruktor Verständnisfrage Java Basics - Anfänger-Themen 1
G Int-Array im Konstruktor Parameter Java Basics - Anfänger-Themen 37
T Datentypen Warum mit Konstruktor Objektvariablen initalisieren? Java Basics - Anfänger-Themen 19
A Vererbung bei Klassen mit Objekt der Klasse im Konstruktor Java Basics - Anfänger-Themen 4
P Konstruktor. Java Basics - Anfänger-Themen 4
D Best Practice Objekt automatisch im Konstruktor füllen? Java Basics - Anfänger-Themen 9
D Objekt oder Konstruktor Java Basics - Anfänger-Themen 2
F Java default Konstruktor Java Basics - Anfänger-Themen 1
R Fragen über den Konstruktor Java Basics - Anfänger-Themen 0
T Konstruktor mit Referenzdatentypen Java Basics - Anfänger-Themen 5
H Klassen Konstruktor Parameter als Instanzvariablen zwischen speichern... Java Basics - Anfänger-Themen 11
T setter im Konstruktor einbauen? Java Basics - Anfänger-Themen 8
R ArrayList im Konstruktor. Java Basics - Anfänger-Themen 4
T Konstruktor Probleme Java Basics - Anfänger-Themen 3
J Wie lässt sich der Konstruktor einer Klasse einer Funktion einer Klasse nutzen. Java Basics - Anfänger-Themen 4
S Variable, die im Konstruktor gesetzt wird, wird nicht gefunden vom Compiler. Java Basics - Anfänger-Themen 4
C Generic im Konstruktor Java Basics - Anfänger-Themen 1
F Privater Konstruktor und statische Methoden Java Basics - Anfänger-Themen 4
W Konstruktor von FileInputStream nicht gefunden Java Basics - Anfänger-Themen 18
B Methoden Konstruktor im Konstruktor aufrufen Java Basics - Anfänger-Themen 2
N Aufgabe: Pizza Konstruktor mit mehreren beliebigen Durchmesser/Preiskombinationen Java Basics - Anfänger-Themen 8
K arraygröße durch variablen Konstruktor? Java Basics - Anfänger-Themen 7
K ArrayList in Konstruktor - wie späterer Zugriff Java Basics - Anfänger-Themen 2
G Verwendung von Konstruktor Java Basics - Anfänger-Themen 8
X Übergabeparameter Konstruktor (File) Java Basics - Anfänger-Themen 13
K Wieso muss man finale statische Variablen sofort oder eben im Konstruktor initialisieren? Java Basics - Anfänger-Themen 2
C Konstruktor in Abstrakten Klassen Java Basics - Anfänger-Themen 4
B Konstruktor Problem Java Basics - Anfänger-Themen 8
Joew0815 konstruktor und damit erstellte objekte Java Basics - Anfänger-Themen 1
K Hashtable mit eigenen Konstruktor Java Basics - Anfänger-Themen 2
S Java Fragen Konstruktor & Statische Methoden Java Basics - Anfänger-Themen 4
H Fehler im Konstruktor abfangen Java Basics - Anfänger-Themen 10
J Konstruktor Problem bei Vererbung Java Basics - Anfänger-Themen 1
I Java Eingabe aus einer anderen Klasse in eine andere an Konstruktor übergeben Java Basics - Anfänger-Themen 4
O Konstruktor und Default Konstruktor Java Basics - Anfänger-Themen 7
S Kapselung Objekt bei Übergabe an Konstruktor nicht initalisiert Java Basics - Anfänger-Themen 3
I Vererbung Frage zum Konstruktor Java Basics - Anfänger-Themen 5
Y Konstruktor - Setter/Getter Java Basics - Anfänger-Themen 3
P Konstruktor Java Basics - Anfänger-Themen 4
E Initialisierung von Attributen und Konstruktor Java Basics - Anfänger-Themen 0
H Compiler-Fehler NullPointerException bei .length, Konstruktor fehlerhaft? Java Basics - Anfänger-Themen 3
M Objekt Array an konstruktor übergeben und Initialisieren Java Basics - Anfänger-Themen 1
llabusch Vererbung Super Konstruktor Java Basics - Anfänger-Themen 5
P Erste Schritte WindowBuilder erstellt Konstruktor wie zugreifen Java Basics - Anfänger-Themen 5
M Parameter von Konstruktor, der Superklassen-Konstruktor aufruft Java Basics - Anfänger-Themen 2
V Was soll alles in den Konstruktor? Java Basics - Anfänger-Themen 3
J Objektwerte addieren / Konstruktor Java Basics - Anfänger-Themen 19

Ähnliche Java Themen

Neue Themen


Oben