Abstrakte Klasse: Konstruktor vs init()

Status
Nicht offen für weitere Antworten.

-frank

Bekanntes Mitglied
ich habe eine abstrakte klasse, die von einigen anderen erweitert wird. einige initialisierungsaufgaben müssen im konstruktor der erweiternden klassen vorgenommen werden, anderes kann in der abstrakten klasse gemacht werden. nun ist es so, dass ich - auch wenn ich den code derzeit nur für mich schreibe - nicht will, dass man irrtümlich die initialiserungsmethode der abstrakten klasse nicht aufruft. folglich würde ich die initialisierung in den konstruktor packen. dann aber muss in der ersten zeile des konstruktors der erweiternden klassen ein super(...) stehen. und das will ich nicht, da ich zuvor vielleicht noch etwas anderes machen möchte.
wäre es das beste eine init(..)-methode zu verwenden, die ein init-flag auf true setzt und diesen in anderen methoden zu überprüfen? (somit könnte ich garantierten, dass die init methode aufgerufen wurde, aber ich will auch nicht in jede methode eine if(init==true) abfrage einbauen...)
also würdet ihr vielleicht doch nur in der JavaDoc darauf hinweisen, dass es die init-methode gibt und man sie aufrufen soll/muss/kann?
 

Wildcard

Top Contributor
Der Konstruktor muss eh zuerst aufgerufen werden, und damit auch super(...).
Wo möchtest du den Code den du gerne vorher ausführen möchtest denn unterbringen?
Wie du siehst geht es nicht, also kannst du deine Initialisierung genauso nach dem super(...) im Konstruktor machen, oder vom Konstruktor aus eine init Methode aufrufen.
 

-frank

Bekanntes Mitglied
Wildcard hat gesagt.:
Wo möchtest du den Code den du gerne vorher ausführen möchtest denn unterbringen?

naja, ich habe (wie du ja schon weißt, weil du mir nicht zum ersten mal hilfst ;) - danke!) eine Klasse AbstractA. Diese wird erweitert von A1..A6. Nun hat jedes AbstractA ein, sagen wir, ObjectA. Dieses soll im Konstruktor übergeben werden. in A1 ist es aber ein ObjectA1, in A2 ein Objekt A2.
wenn ich nun zum beispiel im A1-Konstruktor einen String übergeben bekomme, mit dem ich ObjectA1 initialisiere, dann könnte der Code so aussehen:

public A1(String someString) {
if (!checkStringIsValid(someString) {
throw new exception...
}

Object objA1 = new ObjectA1(someString);

super(objA1);

}

die Konstruktion von objA1 muss nicht zwingend in einer eigenen Zeile sein, von daher könnte ich
auch
Code:
super(new ObjectA1(someString));

schreiben, aber bei langen Konstruktoren wird der Code dadurch nur unleserlich.
und den Stringcheck könnte ich später machen, aber rein intuitiv würde ich lieber zuerst meine werte auf gültigkeit überprüfen und dann die initialisierung vornehmen.
 

Wildcard

Top Contributor
Das geht aber nicht.
Die erste Anweisung in einem Konstruktor ist immer der Aufruf eines super-Konstruktors (mit Ausnahme von Object natürlich)
 

schalentier

Gesperrter Benutzer
Mach alles was irgendwas initialisiert in die init Methode und anstatt super(...) ruf init(..) auf (bzw ruf init(..) im Konstruktor von AbstractA auf).
 

-frank

Bekanntes Mitglied
Wildcard hat gesagt.:
Das geht aber nicht.
Die erste Anweisung in einem Konstruktor ist immer der Aufruf eines super-Konstruktors (mit Ausnahme von Object natürlich)

--> wenn der konstruktor nicht aufwändig ist, mache den gültigkeitscheck einfach erst nachher (ist ja nicht so schlimm dann). wenn die initialisierung sehr aufwändig ist, initialisiere ich nicht im konstruktor sondern in einer init() methode. dass man diese aus der erweiternden klasse aufrufen muss, schreibe ich dann einfach in die Dokumentation. ist das eine akzeptable strategie?
 

Wildcard

Top Contributor
Du kannst eine evtl. init Methode erst aufrufen wenn du ein Objekt der Klasse hast.
Um ein Objekt zu bekommen muss der Konstruktor durchlaufen werden.
Wenn der Konstruktor durchlaufen wird, wird auf den super Konstruktor verweisen.
Fällt dir was auf?
 

-frank

Bekanntes Mitglied
schalentier hat gesagt.:
Mach alles was irgendwas initialisiert in die init Methode und anstatt super(...) ruf init(..) auf (bzw ruf init(..) im Konstruktor von AbstractA auf).

das mit init funktioniert eigentlich eh sehr gut. mir gehts wie gesagt darum, wie ich andere Entwickler am besten darauf hinweise kann, dass sie diese init(..) methode aufrufen müssen. da wäre der konstruktor halt optimal gewesen, weils einem da schon der compiler sagt und nicht nur die doku.
 

-frank

Bekanntes Mitglied
Wildcard hat gesagt.:
Du kannst eine evtl. init Methode erst aufrufen wenn du ein Objekt der Klasse hast.
Um ein Objekt zu bekommen muss der Konstruktor durchlaufen werden.
Wenn der Konstruktor durchlaufen wird, wird auf den super Konstruktor verweisen.
Fällt dir was auf?

dass alle konstruktoren bis rauf zu Object() aufgerufen werden müssen und natürlich durch Object() überhaupt erst mal ein Objekt erzeugt werden muss, ist mir schon klar. aber gerade weil das so ist, wollte ich eben gerne das objekt durch den konstruktor in einen initilaisierten zustand bringen, also in einen, in dem man das Objekt verwenden kann (und dass man nicht nachher noch init(..) aufrufen muss). allerdings ist die klasse ja abstrakt und das beudetet, dass dies für Benutzer des Objekts eh gilt, denn die rufen ja nur den konstruktor von A1 auf (von welchem aus AbstractA.init(..) aufgerufen wird). und leuten, die AbstractA erweitern, kann man wohl zumuten, dass sie die Doku von AbstractA lesen...
 

Wildcard

Top Contributor
Ich verstehe dein Problem nicht.
Jede init Methode von der du möchtest das sie nach der Objekterzeugung aufgerufen wird, wird in jedem Fall nach dem Konstruktor aufgerufen. Demzufolge kannst du das genausogut selbst im Konstruktor erledigen.
 

Ariol

Top Contributor
Seh ich das richtig, das du eine Klasse A mit einem Object a hast und mehrer unterklassen A1 bis Ax mit Objecten a1 bis ax?

Sind die Objecte wiederum Klassen? ( Object objA1 = new ObjectA1(someString); )

---------------------------------

du könntest in der Klasse A weiter Konstruktoren einbauen und dann z.B so aufrufen.

Code:
ObjectA a;

public A ()
{
    this("a");
}

public A (String aname)
{
      a = new ObjectA(aname);
}

------------------

ObjectA1 a1;

public A1 (String aname)
{
      super("aname");
      try
      {
             a1 = (ObjectA1)super.a; // Das super muss nicht sein
      }
      catch (ClassCastException cce){} 
}
 

-frank

Bekanntes Mitglied
Wildcard hat gesagt.:
Ich verstehe dein Problem nicht.
Jede init Methode von der du möchtest das sie nach der Objekterzeugung aufgerufen wird, wird in jedem Fall nach dem Konstruktor aufgerufen. Demzufolge kannst du das genausogut selbst im Konstruktor erledigen.

wenn ich AbstractA.init() im konstruktor von AbstractA aufrufe, hab ich wieder das Problem, dass die fehlerbehandlung von A1 erst nach Abstract.init() erfolgt (und wenn init() aufwändig ist, möchte ich zuerst die fehlerbehandlung).
wenn ich init() im konstruktor von A1 aufrufe, funktioniert alles wunderbar, ABER dies muss natürlich auch im konstruktor von A2..A6 erfolgen und eventuell auch in A7, das jemand anderes schreibt. (und der könnte das init() halt vergessen. eigentlich gings mir nur darum)
 

-frank

Bekanntes Mitglied
@Ariol: das wirft immer eine classcastexception, da es sich ja nicht um einen ObjectA1 handelt (sondern nur um ein ObjectA).

ein anderer ansatz wäre, das Objekt in A1..A6 zu speichern. dort hätte es immer den richtigen typ. und in AbstractA definiere ich nur eine Methode protected abstract getObjectA(). (löst aber mein Problem nicht wirklich, da getObjectA() dann null liefert bis es in A1 gesetzt wird. das kann aber frühestens im Konstruktor passieren.
 

-frank

Bekanntes Mitglied
ich werde es zwar so nicht machen, weils mir zu extrem scheint, aber eigentlich könnte man es so lösen:

Code:
	/**
	 * Ruft AbstractA.init() auf. (fuer mehr info siehe ...)
	 */
	protected abstract void callInit();

auf diese weise MUSS der entwickler die methode implementieren (und kann die init() method enicht irrtümlich übersehen).
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E abstrakte Klasse implementiert ein Interface Java Basics - Anfänger-Themen 40
T Abstrakte Klasse und Interfaces Java Basics - Anfänger-Themen 12
D Abstrakte Klasse, Konstruktorkette, Attribute setzen Java Basics - Anfänger-Themen 12
J abstrakte Methode in Klasse mit Rückgabetyp der abgeleiteten Klasse Java Basics - Anfänger-Themen 5
I Abstrakte Klasse - static Attribute deklarieren Java Basics - Anfänger-Themen 14
T Übungsaufgabe abstrakte Klasse Java Basics - Anfänger-Themen 21
kilopack15 Beziehung Interface - (abstrakte) Klasse -Unterklasse Java Basics - Anfänger-Themen 3
K Abstrakte Klasse: vererbte Klasse; instance of? Java Basics - Anfänger-Themen 26
N Vererbung Abstrakte Klasse stateful Java Basics - Anfänger-Themen 3
W Abstrakte Klasse mit Variable? Java Basics - Anfänger-Themen 2
A Vererbung Abstrakte Klasse mit Methode die Objekte der Subklassen benutzt? Java Basics - Anfänger-Themen 7
W Abstrakte und konkrete Klasse Java Basics - Anfänger-Themen 4
F Abstrakte Klasse doch zum "Teil" instanzieren? Java Basics - Anfänger-Themen 4
M Statische Methoden in Interface/Abstrakte Klasse Java Basics - Anfänger-Themen 6
N Datentypen abstrakte Klasse wird instanziert Java Basics - Anfänger-Themen 3
propra Interface - abstrakte Klasse Java Basics - Anfänger-Themen 18
N Abstrakte Klasse Java Basics - Anfänger-Themen 28
L Über abstrakte Klasse auf eine Klasse zugreifen? Java Basics - Anfänger-Themen 6
D Wann genau abstrakte Klasse und wann ein Interface verwenden? Java Basics - Anfänger-Themen 4
StupidAttack Abstrakte Methoden in nicht-abstrakter Methode in abstrakter Klasse Java Basics - Anfänger-Themen 6
T Abstrakte Klasse Java Basics - Anfänger-Themen 3
S Abstrakte Klasse Java Basics - Anfänger-Themen 5
K Abstrakte Klasse vs. Interface Java Basics - Anfänger-Themen 21
K Abstrakte Klasse bilden? Java Basics - Anfänger-Themen 11
S Abstrakte Klasse, festlegen, dass Methode verändert werden muss. Java Basics - Anfänger-Themen 4
H Warum Java? | Abstrakte Klasse = Modul? Java Basics - Anfänger-Themen 20
J abstrakte klasse und methode super Java Basics - Anfänger-Themen 2
H Eine Abstrakte Klasse muss. Java Basics - Anfänger-Themen 7
G Abstrakte Klasse "Point" Java Basics - Anfänger-Themen 2
G Abstrakte Methode in gleicher Klasse aufrufen Java Basics - Anfänger-Themen 5
M abstrakte Klasse Java Basics - Anfänger-Themen 3
G Abstrakte Klasse (was passiert hier) Java Basics - Anfänger-Themen 3
G Interface oder Abstrakte Klasse? Java Basics - Anfänger-Themen 3
Acha Unterschied Interface - abstrakte Klasse Java Basics - Anfänger-Themen 4
B OOP: abstrakte klasse implementiert interface Java Basics - Anfänger-Themen 3
D Abstrakte Klasse Graphics Java Basics - Anfänger-Themen 3
A Abstrakte Klasse Java Basics - Anfänger-Themen 3
G abstrakte klasse Java Basics - Anfänger-Themen 6
F Abstrakte Klasse Baum Java Basics - Anfänger-Themen 6
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Abstrakte Klassen - Notation Java Basics - Anfänger-Themen 9
S Vererbung Abstrakte Methoden: Wozu das Ganze?! Java Basics - Anfänger-Themen 7
S abstrakte methoden in subclass? Java Basics - Anfänger-Themen 7
G Abstrakte Klassen Java Basics - Anfänger-Themen 11
G Java Abstrakte Methoden Java Basics - Anfänger-Themen 2
L Abstrakte Typen und Schnittstellen Java Basics - Anfänger-Themen 19
S Abstrakte Methode nutzen Java Basics - Anfänger-Themen 9
J Objekte und Abstrakte Klassen Java Basics - Anfänger-Themen 2
J Java Interface/abstrakte Klassen Java Basics - Anfänger-Themen 2
M Erste Schritte Prüfungsbeispiel: Interface / abstrakte Klassen Java Basics - Anfänger-Themen 8
A Interface Abstrakte Interface Methode kann nicht benutzt werden Java Basics - Anfänger-Themen 10
S Gehaltsberechnung (Vererbung, abstrakte Methoden) Java Basics - Anfänger-Themen 6
S Datentypen Abstrakte Datentypen Java Basics - Anfänger-Themen 0
A Abstrakte Datentypen - Methode delete Java Basics - Anfänger-Themen 6
D Abstrakte Klassen Verständniss Frage Java Basics - Anfänger-Themen 4
D Methoden Abstrakte Methoden Java Basics - Anfänger-Themen 3
D Interface Interfaces und abstrakte Klassen implementieren Java Basics - Anfänger-Themen 4
B Abstrakte Klassen Java Basics - Anfänger-Themen 7
C Abstrakte und virtuelle Methoden in Java Java Basics - Anfänger-Themen 4
E verdeckte abstrakte Methode sinnvoll? Java Basics - Anfänger-Themen 7
S Abstrakte Klassen Java Basics - Anfänger-Themen 2
C Dynamische Referenz & abstrakte Klassen Java Basics - Anfänger-Themen 3
V Interface Interfaces und abstrakte Klassen Java Basics - Anfänger-Themen 3
H Abstrakte Basisklasse Verständnisproblem! Java Basics - Anfänger-Themen 8
G Abstrakte Klassen - theoretische Frage Java Basics - Anfänger-Themen 2
OnDemand Abstrakte Klassen Java Basics - Anfänger-Themen 4
T OOP Abstrakte Klassen und ihre Kinder: wie läuft das? Java Basics - Anfänger-Themen 3
M Abstrakte Klassen Java Basics - Anfänger-Themen 2
J Interfaces Abstrakte Klassen Java Basics - Anfänger-Themen 15
M Interface und Abstrakte Klassen Java Basics - Anfänger-Themen 12
D Methoden abstrakte Methoden und Rückgabewerte Java Basics - Anfänger-Themen 2
B Abstrakte Methode vs. Interface Java Basics - Anfänger-Themen 2
R Namenskonvention abstrakte Klassen Java Basics - Anfänger-Themen 6
C OOP Objektstruktur: abstrakte Klassen Java Basics - Anfänger-Themen 3
V Vererbung Abstrakte Methode Java Basics - Anfänger-Themen 3
T OOP abstrakte klassen - methoden Java Basics - Anfänger-Themen 8
M Abstrakte Klassen Java Basics - Anfänger-Themen 21
J Welchen Sinn haben abstrakte Methoden? Java Basics - Anfänger-Themen 4
D Abstrakte Klassen und Interfaces als Paramter in Funktionen Java Basics - Anfänger-Themen 3
T Interfaces: Braucht man abstrakte Klassen eigentlich noch? Java Basics - Anfänger-Themen 3
T OO, Konstruktor, abstrakte Methoden Java Basics - Anfänger-Themen 13
T Abstrakte Klassen Java Basics - Anfänger-Themen 6
C abstrakte Klassen mögen mich nicht... Java Basics - Anfänger-Themen 2
I Abstrakte Klassen Java Basics - Anfänger-Themen 8
D Zusammenfassung von Klassen (Vererbung? Abstrakte Klass? ...?) Java Basics - Anfänger-Themen 8
G Abstrakte Klassen und Methoden Java Basics - Anfänger-Themen 3
C Schnittstellen und Abstrakte Klassen Java Basics - Anfänger-Themen 3
I Abstrakte Klassen Java Basics - Anfänger-Themen 22
G Abstrakte Klassen ? Java Basics - Anfänger-Themen 9
nadoria abstrakte Klassen Java Basics - Anfänger-Themen 6
M Unterscheid Abstrakte Klassen/Interface Klassen? Java Basics - Anfänger-Themen 7
T abstrakte Klassen? Java Basics - Anfänger-Themen 2
G konkretes beispiel: interface hier besser als abstrakte kl. Java Basics - Anfänger-Themen 4
M abstrakte klassen und interfaces Java Basics - Anfänger-Themen 2
L abstrakte Methode nicht implementiert! Java Basics - Anfänger-Themen 5
M abstrakte klassen / Schnittstellen Java Basics - Anfänger-Themen 4
H abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 13
R Interfaces durch abstrakte Klassen ersetzbar? Java Basics - Anfänger-Themen 8
A Eine abstrakte Methode static machen? Java Basics - Anfänger-Themen 4
A Abstrakte Klassen und Interfaces Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben