Zugriff auf protected Fields = guter Programmierstil?

Schrello

Mitglied
Hey,

ich möchte gern einmal eure Meinung wissen, ob es ein guter Programmierstil ist in abstrakten (oder allgemein Superklassen) die Felder protected zu deklarieren und aus den Subklassen auf diese zuzugreifen, oder sollten aus den Subklassen auch lieber über Getter und Setter auf die Felder zugegriffen werden? (Die Felder dann natürlich nicht protected deklariert)

Programmiere für das Studium.

Vielen Dank für eure Meinungen,

Marcel
 

temi

Top Contributor
Wieder mal ein Tipp von Joshua Bloch aus "Effective Java":
Entwerfen und dokumentieren Sie für Vererbung oder verbieten Sie sie.

Das heißt für mich, dass man auch die Fehlverwendung von Oberklassen so gut wie möglich verhindern sollte, was evtl. gegen nicht finale protected Felder spricht. Aber auch mit finalen protected Feldern gibt man Implementationsdetails nach außen, was Änderungen der Basisklasse evtl. erschwert.
 

White_Fox

Top Contributor
Ich sehe das auch so wie temi. Grundsätzlich enge ich die Sichtbarkeit so weit wie möglich ein.

Es ist i.d.R. später kein Problem, die Sichtbarkeit später auszuweiten. Es kann jedoch recht leicht ein Problem werden, die Sichtbarkeit später wieder einzuschränken.

Was gelegentlich mal vorkommen kann, ist, daß die Superklasse Eigenschaften oder Informationen der Kinderklasse braucht. Wenn man z.B. bestimmte Funktionalitäten aus der Superklasse heraus bereitstellen und implementieren will, da 95% des Codes einer Methode in allen Kinderklassen redundant wäre. Dann kann man eine Methode wie protected Object getDifferences(); deklarieren und in dieser die 5% Unterschied auslagern.

Aber wenn die Kinderklassen interne Implementierungsdetails über die Superklasse benötigen, dann würde ich mir mal um die Objektstruktur Gedanken machen, dann scheint die nicht in Ordnung zu sein.
 

thecain

Top Contributor
Ich sehe den Vorteil nicht statt ein protected Feld ein getter/setter Konstrukt zu verwenden. Wenn die erbende Klasse das Feld verändern soll, warum nicht direkt?

Ich sehe hier den Gewinn nicht wirklich. Aber ich muss auch zugeben, ich habe eine "Java Boilerplate" Abneigung. Das getter/setter Konstrukt von Java ist für mich ein super Beispiel für das. Entstanden durch einen Standard (Java Beans) wird es jetzt von vielen Frameworks erzwungen und oft einfach ohne gross nachzudenken für jede private Field generiert.

Ich widerspreche nicht bei Composition over Inheritance, aber das hat damit ja wenig zu tun.
 

temi

Top Contributor
Ich sehe den Vorteil nicht statt ein protected Feld ein getter/setter Konstrukt zu verwenden. Wenn die erbende Klasse das Feld verändern soll, warum nicht direkt?

Ich sehe hier den Gewinn nicht wirklich. Aber ich muss auch zugeben, ich habe eine "Java Boilerplate" Abneigung. Das getter/setter Konstrukt von Java ist für mich ein super Beispiel für das. Entstanden durch einen Standard (Java Beans) wird es jetzt von vielen Frameworks erzwungen und oft einfach ohne gross nachzudenken für jede private Field generiert.

Ja, du hast Recht, insofern auch ich den blindwütigen Einsatz von gettern/settern und hierbei insbesondere von settern nicht gut heiße. Der Zustand einer Klasse sollte über fachliche Funktionen geändert werden und nicht dadurch, dass mehr oder weniger direkt Werte gesetzt werden (können).

[edit]
Allerdings ist Java ja nicht alleine, was getter/setter betrifft; auch z.B. C# hat ein ähnliches Konzept. Und ein großer Vorteil von settern ist, das hier zumindest Vorbedingungen geprüft und entsprechend behandelt werden können. Genauso wie bei gettern beispielsweise nur Kopien der eigentlichen Daten herausgegeben werden können.
[/edit]

Was gegen die direkte Veränderung eines Feldes spricht: Durch das Öffentlichmachen eines Feldes wird ein Implementationsdetail preisgegeben. Kommt es später innerhalb der Klasse zu einer Änderung z.B. des verwendeten Datentyps, dann kann das für die benutzenden Klassen zu massiven Problemen führen.
 
Zuletzt bearbeitet:

thecain

Top Contributor
Der Zustand einer Klasse sollte über fachliche Funktionen geändert werden
Da bin ich bei dir. Ich bin auch dafür, wenn möglich ein Feld private zu halten.

Aber um bei deinem Beispiel zu bleiben, wird der Datentyp geändert, muss der getter angepasst werden, was dazu führt, dass alle Nutzer des getters auch angepasst werden müssen. Man könnte hier jetzt argumentieren, dass der getter jetzt so angepasst werden könnte, dass er diese "Umwandlung" macht. Dadurch handelt man sich aber andere Probleme ein.
1. Man hat zwar getter/setter, aber entspricht nicht dem JavaBeans Standard
2. Man hat eine Art "Compatibility Layer" geschaffen

Meine präferierte Lösung sind Immutable Klassen mit dem Builder-Pattern, Vererbung vermeide ich wenn möglich, da es oft zu besseren Lösungen führt. Wenn ich aber zwischen getter/setter oder protected entscheiden muss, ziehe ich protected vor, wenn die Anforderung ist, dass die erbende Klasse das Attribut sowieso ändern können muss.
 

temi

Top Contributor
Man könnte hier jetzt argumentieren, dass der getter jetzt so angepasst werden könnte, dass er diese "Umwandlung" macht. Dadurch handelt man sich aber andere Probleme ein.
1. Man hat zwar getter/setter, aber entspricht nicht dem JavaBeans Standard
2. Man hat eine Art "Compatibility Layer" geschaffen
Ja, das würde ich so machen und der JavaBeans Standard wäre mir in dem Fall völlig egal.

Alles was an einer Klasse "public" ist, gehört zur Schnittstelle der Klasse und Schnittstellen sollte man gut planen und selten ändern.

Meine präferierte Lösung sind Immutable Klassen [..] Vererbung vermeide ich wenn möglich [..]

Da stimme ich dir zu, und grob zusammengefasst:
  • Zugriff auf Klassen minimieren
  • Immutable Klassen bevorzugen
  • Komposition der Vererbung vorziehen
  • für Vererbung entwerfen und dokumentieren, ansonsten verbieten
  • Schnittstellen den abstrakten Klassen vorziehen
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Vererbung Probleme bei Zugriff auf protected-Methoden in einer Unterklasse Java Basics - Anfänger-Themen 27
I In unterschiedlichen Applikation Zugriff auf eine gemeinsame Anwendung? Java Basics - Anfänger-Themen 8
C Zugriff auf Methode Java Basics - Anfänger-Themen 2
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
J Zugriff auf eine 2. Klasse die per UI-Designer erstellt wurde Java Basics - Anfänger-Themen 1
Encera Zugriff auf Map-Objekte Java Basics - Anfänger-Themen 3
T Zugriff auf Control anderer Klasse Java Basics - Anfänger-Themen 5
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
R TreeSet Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 8
C Kein Zugriff auf Klassenmethoden in Main Methode Java Basics - Anfänger-Themen 23
H Zugriff verweigert Java Basics - Anfänger-Themen 5
moiss002 Umgebungsvariable Kein Zugriff auf ein Array Java Basics - Anfänger-Themen 7
B Probleme mit Zugriff auf Dateisystem Windows 10 ( jFileChooser) Java Basics - Anfänger-Themen 17
B Zugriffsmodifier, Zugriff außerhalb Package Java Basics - Anfänger-Themen 5
C Zugriff auf Attribut von Oberklasse Java Basics - Anfänger-Themen 8
P Klasse hat keinen Zugriff auf getter/setter-Methoden eines Objektes Java Basics - Anfänger-Themen 9
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
M Gettter/Setter Methoden Klassenfelder kapselung und zugriff? Java Basics - Anfänger-Themen 1
M Pfadprobleme - Zugriff auf einen Ordner im Workspace Java Basics - Anfänger-Themen 17
ruutaiokwu Bluetooth-Zugriff, braucht es dazu plattformabhängige Libraries oder kann das Java mittlerweile selbst? Java Basics - Anfänger-Themen 10
R Zugriff auf den Index eines Arrays, welches ein Objekt ist. Java Basics - Anfänger-Themen 4
M Zugriff auf eine ArrayList in einer anderen Klasse Java Basics - Anfänger-Themen 4
P Zugriff auf Variablen anderer Klassen in Greenfoot Java Basics - Anfänger-Themen 1
L Methoden Zugriff <identifier> expected Java Basics - Anfänger-Themen 13
T Java - Zugriff nur mit CLASSPATH ? Java Basics - Anfänger-Themen 7
B Klassen Zugriff auf ein Objekt einer Klasse aus einer Methode heraus Java Basics - Anfänger-Themen 4
L Zugriff auf Attribute eins Objekts über ActionListener Java Basics - Anfänger-Themen 4
D Zugriff auf Methode einer anderen Klasse Java Basics - Anfänger-Themen 5
S Zugriff auf Objekt Java Basics - Anfänger-Themen 5
A Klassen Zugriff auf Instanzen Java Basics - Anfänger-Themen 2
N ArrayList in eigener Klasse erzeugen mit Zugriff Java Basics - Anfänger-Themen 7
J Zugriff auf Variable in anderem Programm Java Basics - Anfänger-Themen 5
Q Zugriff auf Attribute Java Basics - Anfänger-Themen 3
J Klassen Zugriff auf ein "String Array" Java Basics - Anfänger-Themen 6
H Datentypen ArrayList in ArrayList: Zugriff Java Basics - Anfänger-Themen 6
J get methoden zugriff und objekt erzeugung Java Basics - Anfänger-Themen 30
J Datenbank Zugriff Java Basics - Anfänger-Themen 24
T Zugriff auf JCheckBox Java Basics - Anfänger-Themen 8
E Netzlaufwerk Zugriff schlägt fehl Java Basics - Anfänger-Themen 11
C Group, Actor und Instanz-Zugriff, LibGDX Java Basics - Anfänger-Themen 4
S Zugriff auf Attribut einer unbekannten Klasse erhalten Java Basics - Anfänger-Themen 6
R Methoden Methode der GUI-Klasse Zugriff auf Methoden der Hauptklasse Java Basics - Anfänger-Themen 9
S Vererbung Zugriff auf die Basisklasse einer "zweiten" Erweiterungsklasse Java Basics - Anfänger-Themen 2
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
S Vererbung Zugriff auf Methode funktioniert nicht (static/non-static) Java Basics - Anfänger-Themen 3
F Klassen Zugriff auf verschachtelte Objekte Java Basics - Anfänger-Themen 11
J Sichtbarkeit und Zugriff Java Basics - Anfänger-Themen 9
G Wieviel kostet der Zugriff auf Objektattribute im Vergleich zur Erstellung von vars in Methode? Java Basics - Anfänger-Themen 11
L Zugriff auf zwei Java-Quellcodes Java Basics - Anfänger-Themen 3
A OOP Zugriff auf Objekte von außen Java Basics - Anfänger-Themen 8
M Kapselung Datenkapselung Sinn direkter Zugriff? Java Basics - Anfänger-Themen 1
G Methoden Zugriff auf Methode.. aus einer anderen Klasse Java Basics - Anfänger-Themen 6
J JDialog Zugriff auf parent JDialog Java Basics - Anfänger-Themen 5
K Collections Zugriff auf ein bestimmtes Element in der Collection Java Basics - Anfänger-Themen 1
K ArrayList in Konstruktor - wie späterer Zugriff Java Basics - Anfänger-Themen 2
F Zugriff auf Objekt einer anderen Klasse Java Basics - Anfänger-Themen 7
P Zugriff auf Felder in ArrayList Objekten Java Basics - Anfänger-Themen 2
J Erste Schritte Zugriff auf Eigenschaft Java Basics - Anfänger-Themen 2
M MVC - Problem mit Zugriff auf Objekt Java Basics - Anfänger-Themen 4
D Zugriff auf von einer anderen Klasse erstellten Objekten Java Basics - Anfänger-Themen 5
C 5 - Zugriff verweigert Java Basics - Anfänger-Themen 1
K Zugriff auf Variabeln Wert einer Instanz Java Basics - Anfänger-Themen 4
A Methoden Zugriff auf eingelesene Variablen in der main Methode (ohne Änderung der Parameterliste) Java Basics - Anfänger-Themen 4
Z Methoden Zugriff mit Klasse 3 auf Methode von Klasse 2 welche in Klasse 1 erzeugt wird Java Basics - Anfänger-Themen 6
Z Zugriff auf andere Methoden Java Basics - Anfänger-Themen 12
Z Zugriff auf Pakete Java Basics - Anfänger-Themen 5
G Zugriff zwischen Klassen Java Basics - Anfänger-Themen 15
N Problem mit Swing Textfeld und Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 6
H Kein Zugriff auf das Element einer JList möglich: Fehlermeldung Java Basics - Anfänger-Themen 2
W OOP Zugriff auf mit Objekt erstellte Struktur Java Basics - Anfänger-Themen 7
F Klassen Zugriff auf Fenster aus versch. Klassen Java Basics - Anfänger-Themen 5
M Variablen Zugriff von außerhalb eines Blockes auf eine Variable innerhalb eines Blockes Java Basics - Anfänger-Themen 2
U Methoden Zugriff auf Array von weiterer Methode einer Klasse, Rückgabewert Problem Java Basics - Anfänger-Themen 5
B Klassen Zugriff auf Daten der Child-Klasse Java Basics - Anfänger-Themen 9
W Typisierte ArrayList und der Zugriff auf den Typ Java Basics - Anfänger-Themen 5
M Zugriff auf Klasse Java Basics - Anfänger-Themen 2
K Zugriff auf C: Java Basics - Anfänger-Themen 5
S Das richtige Format für den SOAP Zugriff Java Basics - Anfänger-Themen 0
S Klassen Zugriff auf Attribute einer zweiten Klasse, welche durch dritte gesettet wurden? Java Basics - Anfänger-Themen 2
N Zugriff bei Package Struktur Java Basics - Anfänger-Themen 6
M Enum: Zugriff auf Konstanten Java Basics - Anfänger-Themen 7
V Zugriff auf jProgressbar Java Basics - Anfänger-Themen 10
B Zugriff auf csv-Datei per hashmap Java Basics - Anfänger-Themen 5
G Spalte in JTable unsichtbar machen, Zugriff auf Daten ermöglichen Java Basics - Anfänger-Themen 2
T ZUgriff auf 'Werte' Java Basics - Anfänger-Themen 3
J Vererbung Zugriff auf private Variable Java Basics - Anfänger-Themen 10
C Klassen Zugriff auf Objekt anderer Klasse Java Basics - Anfänger-Themen 8
B Methoden Zugriff auf Variable ermöglichen Java Basics - Anfänger-Themen 3
M Zugriff auf Arraylist Java Basics - Anfänger-Themen 7
D Kein Zugriff auf JFrame Java Basics - Anfänger-Themen 2
K Zugriff einer Klasse auf eine andere Andere -> bad operand for binary operator Java Basics - Anfänger-Themen 5
B Erste Schritte Array-Zugriff Java Basics - Anfänger-Themen 10
D OOP Zugriff auf Objekte A in Klasse A aus Objekt B in Klasse B Java Basics - Anfänger-Themen 3
T Collections Zugriff auf Elemente aus Iterator() Schleife Java Basics - Anfänger-Themen 4
J Threads Zugriff auf Attribute Java Basics - Anfänger-Themen 16
N Kein Zugriff auf Ordner -> NullPointerException Java Basics - Anfänger-Themen 2
I kein zugriff auf jList oder Textfield Java Basics - Anfänger-Themen 2
N Problem bei Zugriff auf Textfelder Java Basics - Anfänger-Themen 6
LittleJavaCup Zugriff auf Klasse von package Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben