Methoden in abstrakter Klasse: public oder protected?

Status
Nicht offen für weitere Antworten.

Ocean-Driver

Bekanntes Mitglied
Hallo,


Ich stelle mir die Frage, ist es wirklich egal ob die Methoden / Konstruktoren protected oder public sind?
Ich mein, da die Klasse abstrakt ist, reicht es ja die Methoden öffentlich zu lassen, da sie an dem abstrakten Objekt direkt ja nicht genutzt werden kann.

Sollten die Attribute in einer abstrakten Klasse private oder protected sein?



Und, wenn ich über super(); den Konstruktor der Oberklasse aufrufe, und dort Methoden verwendet werden, werden dann auch die Methoden aus der Oberklasse verwendet, oder die aus der abgeleiteten Klasse?


Danke schonmal. :)
 

HLX

Top Contributor
Ocean-Driver hat gesagt.:
Hallo,


Ich stelle mir die Frage, ist es wirklich egal ob die Methoden / Konstruktoren protected oder public sind?
Nein.

Ocean-Driver hat gesagt.:
Ich mein, da die Klasse abstrakt ist, reicht es ja die Methoden öffentlich zu lassen, da sie an dem abstrakten Objekt direkt ja nicht genutzt werden kann.
An der konkreten Ausprägung kann sie genutzt werden.

Ocean-Driver hat gesagt.:
Sollten die Attribute in einer abstrakten Klasse private oder protected sein?
private

Ocean-Driver hat gesagt.:
Und, wenn ich über super(); den Konstruktor der Oberklasse aufrufe, und dort Methoden verwendet werden, werden dann auch die Methoden aus der Oberklasse verwendet, oder die aus der abgeleiteten Klasse?
Die aus der Oberklasse, solange du sie nicht überschrieben hast.
 
M

maki

Gast
Sollten die Attribute in einer abstrakten Klasse private oder protected sein?
Je nachdem, wo du sie brauchst.
Nur in der abstrakten Klasse -> private.
Soll es möglich sein das Unterklassen direkt darauf zugreifen, dann protected.

Es ist eigentlich immer dasselbe ;) egal ob abstract oder nicht...
 

tfa

Top Contributor
maki hat gesagt.:
Soll es möglich sein das Unterklassen direkt darauf zugreifen, dann protected.
Oder private mit den entsprechenden (public oder protected) Gettern in der Oberklasse.

EDIT: OK, das ist dann kein direkter Zugriff mehr.
 

André Uhres

Top Contributor
Zusammenfassend könnte man sagen, dass man anhand der Definition der Schlüsselwörter
sorgfältig abwägen sollte, was jeweils zutrifft:
"public" sind alle Schnittstellen, die die ganze Welt sehen soll.
"protected" ist alles, was für Unterklassen interessant sein kann.
"private" ist alles, was nur die Klasse selbst sehen soll (hier sollte man besonders vorsichtig sein,
weil ein private an der falschen Stelle die Wiederverwendbarkeit der Klasse unnötig einschränkt;
im Zweifelsfall lieber protected statt private wählen).
 

Ocean-Driver

Bekanntes Mitglied
Hi,


Ok, also attribute immer private, methoden am besten öffentlich, weil sie ja an den geerbten Klassen genutzt werden können.

Konstruktoren hingegen, können ja public oder protected sein,oder?
 

HLX

Top Contributor
Das wurde bereits ausgiebig erläutert.

Ob public oder protected hängt davon ab, ob du einen Zugriff außerhalb des package zulassen willst oder nicht. Das gilt sowohl für Konstruktoren, als auch für Methoden. Hier gibt es keinen generellen "best case".

Falls du dir nicht sicher bist, mach deine Methoden erstmal private. Wenn du dann feststellst, dass deine Funktion in den Unterklassen verfügbar sein muss, ändere die Sichtbarkeit auf protected. Wenn darüber hinaus eine generelle Verfügbarkeit bestehen muss, mach sie public. Schränke die Sichtbarkeit erstmal soweit wie möglich ein. Das trägt auch zur Übersichtlichkeit bei.
 

André Uhres

Top Contributor
HLX hat gesagt.:
..Wenn du dann feststellst, dass deine Funktion in den Unterklassen verfügbar sein muss..
Das ist ein heikles Problem. Wenn es eine Klasse ist, die andere benutzen und erweitern sollen,
dann ist nicht unbedingt vorhersehbar, welche Funktion in ihrem jeweiligen Kontext verfügbar oder erweiterbar sein muss.
Deshalb sagte ich schon oben, im Zweifelsfall eher protected wählen als private :wink:
 
G

Guest

Gast
Und Vorsicht beim Aufruf überschriebener Methoden aus dem Super-Konstruktor heraus. Am besten keine
virtuelle Methoden in Konstruktoren verwenden.
z.B.
Code:
abstract class A
{
   public A()
   {
      namenAusgeben();
   }

   protected abstract void namenAusgeben();
}

class B extends A
{
   private String name = "Brunhilde";

   public B()
   {
      super();
   }

   protected void namenAusgeben()
   {
      System.out.println(name); // name ist noch nicht initialisiert!
   }
}
 

HLX

Top Contributor
André Uhres hat gesagt.:
Das ist ein heikles Problem. Wenn es eine Klasse ist, die andere benutzen und erweitern sollen,
dann ist nicht unbedingt vorhersehbar, welche Funktion in ihrem jeweiligen Kontext verfügbar oder erweiterbar sein muss.
Deshalb sagte ich schon oben, im Zweifelsfall eher protected wählen als private :wink:

Wenn ich eine Schnittstelle entwickle, sollte mir allerdings auch klar sein, welche Funktionalität ich veröffentlichen möchte und welche nicht. Ich bezog mich eher auf den Fall, dass der Entwickler sich noch nicht im Klaren darüber ist. Da sage ich, im Zweifelsfall erstmal verbergen.
 

André Uhres

Top Contributor
Niemals! Bitte!

Eine Dialog-Klasse könnte z.B. eine Methode "handleOKBtn()" enthalten.
Jetzt will ich die Funktionalität von handleOKBtn() ändern und den Rest der Klasse
wiederverwenden. Wenn diese Methode private ist, müsste ich die ganze Klasse neu implementieren,
also das Rad neu erfinden.

Andererseits, wenn solche Helper-Methoden protected statt private sind,
könnte ich einfach die Bedeutung der Methode handleOKBtn() neu definieren und die
ganze Klasse wiederverwenden.

Wenn du also Klassen entwickelst, die andere benutzen werden, kannst du nie sicher sein,
was sie aus der Klasse machen werden. Wenn es jedoch dein Ziel ist, die
Wiederverwendbarkeit zu fördern, dann kannst du deine Klasse erweiterbar machen, indem du die
solche Helper-Methoden protected machst. Zudem gibst du vor der Öffentlichkeit keine
Sicherheit preis, weil "protected" die Benutzer daran hindert, die Methode direkt zu
gebrauchen. Andererseits haben diejenigen, die von deiner Klasse erben, Zugang zu diesen
Helper-Methoden. Allgemein musst du jedoch davon ausgehen, dass die Leute, die die
Klasse erweitern, wissen was sie tun. Selbst wenn sie es nicht wissen, dann ist das Schlimmste,
was sie tun können, dass sie ihre abgeleitete Klasse kaputtmachen.

"protected" für Helper-Methoden zu wählen, gibt deiner Klasse einen Maximum an Flexibilität,
ohne die Kapselung aufzugeben.
 

HLX

Top Contributor
Genau. Damit hast du einen konkreten Grund, diese Methode protected zu machen.

Ich prüfe zuerst konkret, ob ich jeweils die entsprechende Flexibilität gewährleisten möchte. Bei Helper-Methoden oder gar Helper-Klassen ist das i.d.R. obligatorisch. Je tiefer ich jedoch in ein zusammenhängendes System komme, in dem es wenig Allgemeingültigkeiten gibt und das bestimmten Anforderungen unterliegt, desto hilfreicher kann das Verbergen von Funktionen sein, da hier ggf. Dinge behandelt werden, die auf den ersten Blick nicht sichtbare, negative Auswirkungen auf die Anwendung haben.

Ich bin somit gezwungen, mich damit auseinanderzusetzen und mein Vorgehen, ggf. auch das Konzept zu hinterfragen. So laufe ich nicht so schnell Gefahr meine Flexibilität für das Umgehen von Problemen und hacken von schnellen Lösungen zu missbrauchen. Dabei kann man sich letztendlich verzetteln und die Änderbarkeit zentraler Funktionalität erschweren.
 

tfa

Top Contributor
Ich finde, eine gute Kapselung und geringe Kopplung sind allemal wichtiger als eine (eventuell mögliche) Wiederverwendung durch Vererbung.
Vererbung sollte in der OOP eine "is-a"-Beziehung abbilden und nicht dem Quelltext-Recycling dienen. Das geht z.B. besser durch Komposition und Delegation.
In so fern bin ich der Meinung von HLX, lieber private als protected.
 

André Uhres

Top Contributor
Ja gut, Zweifelsfall hatte ich ja auch nicht im Sinne von undurchsichtig gemeint. Die Vokabel war wohl nicht glücklich gewählt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Leere vererbte Interface-Methoden Allgemeine Java-Themen 8
R Programm führt Methoden gleichzeitig aus Allgemeine Java-Themen 2
Encera Unterschied zweier "toString"-Methoden Allgemeine Java-Themen 1
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
B Arrays von Methoden möglich? Allgemeine Java-Themen 44
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
N abstracte klassen methoden Allgemeine Java-Themen 32
G Methoden für die Zukunft sinnvoll? Allgemeine Java-Themen 4
nonickatall Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen? Allgemeine Java-Themen 6
LimDul Hä? Lambda-Ausdruck geht, Methoden-Referenz nicht Allgemeine Java-Themen 8
B Methoden Java Getter und Setter Methoden Allgemeine Java-Themen 9
Y Java Methoden unterschiedliche Zahlenreihen Allgemeine Java-Themen 2
S Interface Design von HookUp oder Callback Methoden für eigenes Framework Allgemeine Java-Themen 9
F Sich automatisch aufrufende Java-Methoden Allgemeine Java-Themen 2
J Namen von Methoden über Reguläre Ausdrücke bearbeiten Allgemeine Java-Themen 6
D Methoden Methoden anpassen und fehlende Funktionen hinzufügen Allgemeine Java-Themen 475
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
R Statistische Methoden (Mathematik) Aufgabe Allgemeine Java-Themen 9
X Brüche kürzen mittels Methoden und ggT Allgemeine Java-Themen 15
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
L mehrere Methoden Allgemeine Java-Themen 19
KeexZDeveoper Zugriff auf Methoden vom Server Allgemeine Java-Themen 7
B StAX Parser - mehrere Methoden, ein XML Allgemeine Java-Themen 4
F Operationen/Methoden einen WebService im Browser mit Apache Axis aufrufen Allgemeine Java-Themen 4
A Automatisches Methoden Laufzeiten logging? Allgemeine Java-Themen 7
M Quellcode von Java-Methoden Allgemeine Java-Themen 9
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
N HashMap und Methoden richtig einbinden Allgemeine Java-Themen 2
R Variable durch mehrere Methoden ändern und nutzen Allgemeine Java-Themen 17
Q-bert Methoden Methoden in Java Allgemeine Java-Themen 13
D Methoden Java-Aufgabe Allgemeine Java-Themen 2
M Compiler-Fehler Methoden-Referenz Allgemeine Java-Themen 5
X Threads Externe Variablen in Run Methoden verändern Allgemeine Java-Themen 4
S 2 methoden mit gleichen namen und ein Interface Allgemeine Java-Themen 9
F Enum-werte als Methoden-Parameter übergeben Allgemeine Java-Themen 6
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
E OOP Objekte und Methoden Allgemeine Java-Themen 1
K Java ruft Methoden nicht der Reihe nach auf Allgemeine Java-Themen 14
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
T Java Array in Methoden Allgemeine Java-Themen 1
D Code für bereitgestellte Methoden Allgemeine Java-Themen 1
P Entity Objekt Methoden vs Service methoden Allgemeine Java-Themen 2
R Signatur von Methoden in eine Datei schreiben? Allgemeine Java-Themen 4
A Methoden verändern Allgemeine Java-Themen 12
F Methoden Arraylist weiterverwenden nach methoden Aufruf Allgemeine Java-Themen 2
J Best Practice Testen von protected Methoden Allgemeine Java-Themen 7
L Methoden "Schiffe versenken" Quellcode in Methoden umwandeln Allgemeine Java-Themen 6
G Matrix reduzieren zwei Methoden Allgemeine Java-Themen 2
Sogomn Best Practice "Doppelte" Methoden Allgemeine Java-Themen 3
Paul15 String Methoden Allgemeine Java-Themen 7
G Methoden BMI -Wert Aufgabe(Methoden) Allgemeine Java-Themen 4
F Testen von Methoden Allgemeine Java-Themen 3
S "Vererben" statischer Felder/Methoden Allgemeine Java-Themen 4
F Methoden in der Enumeration Klasse Allgemeine Java-Themen 1
S Methoden ohne Methodenkopf ?! Allgemeine Java-Themen 5
T Überschreiben von Methoden Allgemeine Java-Themen 6
M Methoden werden in falscher Reihenfolge bearbeitet Allgemeine Java-Themen 10
S Methoden Methoden überschreiben Allgemeine Java-Themen 3
N Threads statische Methoden in Threads Allgemeine Java-Themen 5
O Java-Obfuscator, welcher einzelne Methoden, Klassen und Ordnerstrukturen ausnehmen kann. Allgemeine Java-Themen 1
A also definition von klassen und string methoden und algorithmik Allgemeine Java-Themen 13
X Eigene Annotation - mit Bedingung für ganze Klassen oder Methoden Allgemeine Java-Themen 2
A Threads Lock über mehrere Abschnitte in verschiedenen Methoden Allgemeine Java-Themen 5
S Methoden Frage Allgemeine Java-Themen 2
R Wie kann man diese Methoden in arrays etablieren? Allgemeine Java-Themen 8
M Methoden in Rescources speichern Allgemeine Java-Themen 4
G Synchronisation nicht statischer Methoden Allgemeine Java-Themen 4
A Vererbung finale Methoden überschreiben Allgemeine Java-Themen 24
A Methoden parallelisieren? Allgemeine Java-Themen 2
L Methoden methoden an generischen klassentyp anpassen Allgemeine Java-Themen 5
C Methoden Übernahme von standart nativen Methoden? Allgemeine Java-Themen 9
B Zusammenfassen verschiedener ähnlicher Methoden Allgemeine Java-Themen 8
K JNI: Methoden aus unterschiedlichen Threads aufrufen Allgemeine Java-Themen 3
P Unterschiedliche Clone- Methoden Allgemeine Java-Themen 5
MQue Spezialfrage Überschreiben von Methoden Allgemeine Java-Themen 14
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
MiMa Rekursive Methoden Allgemeine Java-Themen 3
S Programm das alle aufgerufenen Methoden ausgibt..? Allgemeine Java-Themen 6
F ListIterator (next & previous methoden) Allgemeine Java-Themen 5
W Frage zu Refactoring statischer Methoden Allgemeine Java-Themen 4
M Methoden/Klassen für andere Projekte Allgemeine Java-Themen 4
T Methoden per String-Namen aufrufen Allgemeine Java-Themen 2
C Kapselung Warum graift man auf Variablen nur über Methoden und nich direkt zu? Allgemeine Java-Themen 10
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
A Methoden ohne Referenzen finden Allgemeine Java-Themen 9
turmaline OOP zwei gleiche Methoden mit kleinen Unterschieden Allgemeine Java-Themen 15
G JUnit Test Methoden in anderen Thread verlagern Allgemeine Java-Themen 4
K Auf Methoden der Runnable Klasse zugreifen Allgemeine Java-Themen 2
S Methoden Class.forName() >> Methoden - Reihenfolge Allgemeine Java-Themen 5
D Passende Name für Methoden finden Allgemeine Java-Themen 3
D Wann sollte ich statische Methoden und Variablen benutzen? Allgemeine Java-Themen 44
A Methoden laufen im Konstruktor, außerhalb allerdings nicht Allgemeine Java-Themen 2
M Generische Methoden mit Java und globale Variablen Allgemeine Java-Themen 9
GianaSisters ArrayList in Methoden übergeben Allgemeine Java-Themen 3
S static methoden Allgemeine Java-Themen 9
J coole Methoden Allgemeine Java-Themen 6
R Methoden in einem Thread unterschiedlich oft ausführen Allgemeine Java-Themen 4
A OOP: Überschreiben/Implementierung von Methoden Allgemeine Java-Themen 5
P Methoden und Werte Allgemeine Java-Themen 17

Ähnliche Java Themen

Neue Themen


Oben