Ich dachte, dass, intuitiv gesprochen, ein Konstruktor in Java die Sache ist, die ein Objekt macht, und dass nichts dieses Objekt berühren kann, bis sein Konstruktor zurückkommt. Ich habe über diese bewährt falsch jedoch immer und immer wieder:Welche Eigenschaften werden von Konstruktoren in Java garantiert?
- nicht initialisierte Objekte durch den Austausch von
this
- uninitialized objects can be leaked by a subclass accessing it from the finalizer
- uninitialized objects can be leaked to another thread before they're fully constructed
Alle verletzen dieser Fakten durchgesickert ist meine Intuition was ich dachte, ist ein Konstruktor.
Ich kann nicht mehr mit Zuversicht sagen, was ein Konstruktor tatsächlich in Java tut, oder wofür es verwendet werden soll. Wenn ich ein einfaches DTO mit alle letzten Felder mache, dann kann ich verstehen, was die Verwendung des Konstruktors ist, denn das ist genau das gleiche wie eine Struktur in C, außer es kann nicht geändert werden. Ansonsten habe ich keine Ahnung, für welche Konstruktoren Java zuverlässig verwendet werden kann. Sind sie nur eine Konvention/syntaktischer Zucker? (Wenn es nur Factories gäbe, die Objekte für Sie initialisieren würden, hätten Sie nur X x = new X()
, dann ändern Sie jedes Feld in x
, damit sie keine Standardwerte haben - bei den 3 obigen Fakten wäre dies fast gleichbedeutend mit Java.)
kann ich zwei Eigenschaften nennen, die von Konstrukteuren tatsächlich garantiert werden: Wenn ich X x = new X()
tun, dann weiß ich, dass x
eine Instanz von X
ist aber nicht eine Unterklasse von X
, und seine endgültigen Feldern vollständig initialisiert werden. Sie könnten versucht sein zu sagen, dass Sie wissen, dass der Konstruktor von X
fertig ist und Sie ein gültiges Objekt haben, aber das ist nicht wahr, wenn Sie X
an einen anderen Thread übergeben - the other thread may see the uninitialized version (dh was Sie gerade gesagt haben, ist nicht anders als die Garantien für den Aufruf einer Fabrik). Welche anderen Eigenschaften garantieren Konstrukteure eigentlich?
also Ihre Frage ist, welche Eigenschaften garantieren Konstruktoren in Java ja? – Woot4Moo
@ Woot4Moo: Ja, das und/oder was ist der Punkt in ihnen (z. B. wenn sie nur für die Konvention sind, wie Kommentare/Namen)? – Dog
Ich habe den Titel geändert, weil ich denke, dass es mehr Zuschauer bekommen wird. – Woot4Moo