Ich nehme die Initialisierung eines Objekts praktisch nur in einem Konstruktor vor, Grund: Ich mache eh so gut wie alle Felder final, und dann erinnert mich der Compiler daran, dass mein Konstruktor wahrscheinlich nicht wie gewünscht funktioniert, wenn ich diesen Feldern noch keinen Wert zugewiesen habe.
Wenn ich einem Feld dagegen einen Wert bei der Deklaration zuweisen würde, kann es passieren, dass der Compiler grünes Licht gibt, obwohl das Objekt dann möglicherweise falsch initialisiert ist. (Zumindest passiert es mir leicht, in einem Wust von Deklarationen doch glatt noch eine bestimmte Zuweisung zu übersehen.) Will ich einem final field dann doch mal einen anderen Wert zuweisen als in der Deklaration (angenommen, es wäre so), dann lässt der Compiler so was nicht zu, und zwar zu Recht. Und ansonsten gibt es ja die Möglichkeit, zu Beginn einen anderen Konstruktor aufzurufen. Das finde ich nicht umständlich, sondern sorgt meines Erachtens sogar für saubereren Code. Noch schärfer: ich halte es sogar für unsauber, wenn mehrere verschiedene Konstruktoren stark voneinander abweichen (und eben nicht aufeinander aufbauen). Genauso finde ich es bedenklich, wenn "mal eben" ein neuer Konstruktor hinzukommt, der nicht zu den bisherigen "passt".
(Non-final fields wähle ich typischerweise so, dass ihr default-Wert laut Sprachspezifikation praktisch genau meinen Bedürfnissen entspricht, oder es gibt einen Setter, den ich dann da aufrufe.)
Ark