Konvention zur Initialisierung von Attributen

Hallo,
Ich habe gehört, dass man die Initialisierung von Attributen nicht bei der Deklaration schreiben soll, sondern immer im Konstruktor.

Java:
public class MyClass {
	int myAttribute1 = 1;	// The initialization is done in the declaration. (AVOID)
	int myAttribute2;		// The initialization is done later in the constructor. (PREFER)
	
	MyClass(){
		myAttribute2 = 1;	// Initialization in the constructor! (PREFER)
	}
}

Aber wieso ist das so? Gibt es eine Konvention zur Initialisierung von Attributen?

Vielen Dank,
Michael
 

bERt0r

Top Contributor
Och da gibts bei weitem wichtigere Konventionen die man berücksichtigen sollte. Im Deutschen sollte man auch statt "Das Haus vom Dieter" "Dieters Haus" sagen. Das wird mMn nicht so heiß gegessen.
Der Grund warum mans im Konstruktor machen sollte liegt darin, dass man ja mehrere Konstruktoren haben kann, welche deine Attribute dann unterschiedlich initialisieren könnten. Und wenn man dann die Hälfte der Attribute per Autokonstruktor und die andere Hälfte im "richtigen" initialisiert kanns unübersichtlich werden.

Allerdings halte ich es auch für problematisch, wenn man so viele Memberattribute in einer Klasse hält, dass man beim initialisieren nicht mehr durchblickt. Von da her hatte ich in der Hinsicht noch nie Problemen einen Code zu lesen.
 
Danke für deine Antwort. Deine Begründung hört sich logisch an.

Och da gibts bei weitem wichtigere Konventionen die man berücksichtigen sollte.
Da hast du schon Recht. Doch ich bin auf der Suche nach einer Konvention, die dazu rät, damit ich auf diese verweisen kann (z.B. wenn jemand neues zur Arbeitsgruppe dazu stößt). Ich habe gelesen, dass es in den "Java Coding Conventions" stehen soll. Ich vermute, dass damit die hier gemeint ist. Doch da steht nichts zu diesem Thema drin.

Allerdings halte ich es auch für problematisch, wenn man so viele Memberattribute in einer Klasse hält, dass man beim initialisieren nicht mehr durchblickt.
Nur aus Neugierde: Auf welche Techniken greift man hierbei zurück (wenn man das überhaupt so pauschal sagen kann).
 

Vancold

Aktives Mitglied
Hey!


Es hat sich einfach so ergeben das Instanzvariablen in der Klasse im Konstruktor initialisiert werden.
Ich für meinen Teil initialisiere z.B. meine ActionListener schon bei der Deklaration.

Java:
public class CoolesPanel {

  private ButtonHandler buttonListener = new ButtonHandler();

  //Stuff that happens

Warum ich das mache ist ganz einfach. Da meine Listener unabhängig vom eigentlich Objekt sind und eigenständig, sollten sie auch so definiert sein. Für mich ist das eine kleine Instanz die alleine läuft, daher definiere ich sie vorher. Diesen brauche ich dann nur hinzufügen. (Ist reine Geschmackssache; Ich baue meine Listener so das eine Art von Input von einem Listener gehandhabt werden kann).

So viel zu Konventionen.

Also warum Instanzvariablen vom Konstruktor erstellen lassen?

Ganz einfach:

WENN eine Instanzvariable ein Teil von dem Objekt ist (Sagen wir mal eine Koordinate) dann hat sie essentielle Werte:

Das X und das Y. Diese sind so wichtig das sie vom Objekt selbst erstellt und bearbeitet werden müssen.
Aber wenn du jetzt z.b sagst ich mag eine kleines Helferprogramm, das mir irgendwelche Services und erweiterungen bietet das in diesem Objekt drinnen ist (Egal ob das jetzt wirklich logisch klingt in dem Fall; es ist nur mal angenommen) dann würde ich sagen es ist ein Teil der nicht essentiel zum funktionieren ist bzw ein Teil der eine Koordinate nicht ausmacht. Diese schreibe ich extra an. (BZW erstelle mir eine Methode initBLA).

Das ist die einzige Konvention die ich dir anbieten kann.

Lebenswichtige und eindeutige Attribute sind im Konstuktor zu erstellen. Attribute die zwar nötig sind aber nichts über das Objekt aussagen nicht (Z.B. das Pong-Pedal aus Pong. Hat viele Attribute und Werte und Aussehen aber den KeyboardListener initialisiere ich in einer eigenen Methode; weil es nicht das Pedal per se definiert nur den inneren Ablauf; Es kann ein Pedal geben ohne Listener und es würde funktionieren)


Ich weiß ich labbere viel. Ka ob dir das überhaupt was bringt und was beantwortet. Hoffe ich konnte dir was dazu sagen.

Außerdem ist es besser wenn du die Werte im Konstuktor definierst. Du kannst sie ja dadurch dynamischer gestalten. Und vor Konstruktoraufruf Variablen erstellen ist in den meisten Fällen nutzlos da sie so und so überschrieben werden (bzw. du ja nicht weißt welche Werte sie annehmen sollen; Wenn sie doch nur 1 Wert haben dann ist das ok. Dann definierst du sie als final.)



lg

Rene
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
Dragonfire Code Konvention for-Schleife / return Allgemeine Java-Themen 15
T [Konvention/Stil] PropertyChangeEvent vorher oder nachher? Allgemeine Java-Themen 2
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
S Die Initialisierung von Feldern in ableitender Klasse erzwingen..? Allgemeine Java-Themen 16
S einmalige Initialisierung Allgemeine Java-Themen 7
A Observer und Initialisierung Allgemeine Java-Themen 7
hdi Frage zur Objekt Initialisierung Allgemeine Java-Themen 4
M Initialisierung von Objektvariablen - vor/nach dem this()? Allgemeine Java-Themen 4
V Initialisierung nur im Konstruktor? Allgemeine Java-Themen 14
M Initialisierung Enumuration Allgemeine Java-Themen 15
F Initialisierung von Variablen Allgemeine Java-Themen 11
G Object erstellung und initialisierung. Allgemeine Java-Themen 4
M Initialisierung von Attributen Allgemeine Java-Themen 7
S iText Cellen mit Attributen aus ArrayListen füllen Allgemeine Java-Themen 1
L Annotations um Gültigkeit von Attributen zu definieren? Allgemeine Java-Themen 4
C ArrayList anhand von zwei Attributen sortieren Allgemeine Java-Themen 4
faetzminator Regex zur Suche von "value-losen" Attributen in HTML Tags Allgemeine Java-Themen 7
G Wann statische Methoden, statische Attributen? Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben