Mit anderen Worten, warum benötigen Sie einen Instanzinitialisierer? Welchen Unterschied oder welchen Vorteil haben Sie beim Schreiben eines Instanzinitialisierers über einen Konstruktor?Wie unterscheidet sich ein Instanzinitialisierer von einem Konstruktor?
Antwort
Dies scheint es gut zu erklären:
Instanz initializers eine sinnvolle Alternative zu Instanzvariable initializers wann immer:
initializer Code Ausnahmen abfangen müssen, oder
ausführen Fantastische Berechnungen, die nicht mit einem Instanzvariableninitialisierer ausgedrückt werden können. Sie könnten natürlich immer einen solchen Code in Konstruktoren schreiben.
Aber in einer Klasse, die mehrere Konstrukteure hätten, würden Sie den Code in jedem Konstruktor wiederholen. Mit einem Instanzinitialisierer können Sie den Code nur einmal schreiben, und es wird ausgeführt, egal was Konstruktor zum Erstellen des Objekts verwendet wird. Instanzinitialisierer sind auch nützlich in anonymen inneren Klassen, die keine Konstruktoren überhaupt deklarieren können.
Von: JavaWorld Object initialization in Java.
Auf der anderen Seite können Sie Code einmal in einem Konstruktor schreiben und nur von allen anderen Konstruktoren aufrufen. Aber anonyme innere Klassen machen einen guten Punkt. –
Sie können es von anderen Konstruktoren aufrufen - aber Sie wiederholen den Anruf erneut. Wenn Sie einen neuen Konstruktor hinzufügen, müssen Sie daran denken, den Aufruf hinzuzufügen. Nicht so bei einem Instanzinitialisierer. – talonx
@talonx, ich stimme deinem Argument über das Vergessen zu, aber die Verwendung von Standardverhalten ist gleichermaßen gefährlich. Wenn ein Supporter einen Konstruktor im Legacy-Code liest, würde man nicht immer daran denken, nach möglichen Instanz-Initialisierern zu suchen. Dagegen wird ein explizit verwendetes init() hervorstechen. – Assambar
Wenn Sie viele Konstruktoren haben und möchten, dass ein gemeinsamer Code für jeden Konstruktor ausgeführt wird, können Sie den Instanzinitialisierer verwenden. Er wird für alle Konstruktoren aufgerufen.
In Bezug auf den Objektlebenszyklus gibt es keinen Unterschied. Beide werden zur Konstruktionszeit aufgerufen, und logisch kann der Initialisierungsblock als Teil der Konstruktion betrachtet werden.
Semantisch ist ein initializer ein nettes Tool für mehrere Gründe zu haben:
der Initialisierer kann, indem die Initialisierung Logik neben der Variablen initialisiert wird die Lesbarkeit des Codes verbessern:
public class Universe {
public int theAnswer;
{
int SIX = 6;
int NINE = 7;
theAnswer = SIX * NINE;
}
// a bunch of other vars
}
vs
public class Universe {
public int theAnswer;
// a bunch of other vars
public Universe() {
int SIX = 6;
int NINE = 7;
theAnswer = SIX * NINE;
// other constructor logic
}
}
Initialisierer werden unabhängig von aufgerufen, von denen Konstruktor verwendet wird.
Initialisierer können in anonymen inneren Klassen verwendet werden, wo Konstruktoren nicht können.
Was Sie haben, ist ihr technisch ein "Instanzvariableninitialisierer" und kein "Instanzinitialisierer" (ein Block, der direkt in einer Klasse verschachtelt ist). Siehe JLS 3. Abschnitt 8.6. –
Oh, alles klar. Das Beispiel wurde geändert. – ykaganovich
Instanzinitialisierungsblock hat keinen Namen wie hier gezeigt (http://www.javatpoint.com/instance-initializer-block). Ist es nicht? Sie haben Ihren Instanzinitialisierungscode mit dem Namen "theAnswer" markiert. Ist das korrekt? oder ich vermisse etwas. – RBT
Ich würde das Instanzinitialisierungs-Idiom im Allgemeinen vermeiden - der einzige wirkliche Vorteil, den es über Variableninitialisierungen gibt, ist die Ausnahmebehandlung.
Und da eine init-Methode (aufrufbar vom Konstruktor) auch die Exception-Behandlung ausführen kann und auch Konstruktor-Setup-Code zentralisiert, aber den Vorteil hat, dass sie mit Konstruktor-Parameterwerten arbeiten kann, würde ich sagen, dass der Instanz-Initialisierer redundant ist. und deshalb zu vermeiden.
Initialisierer ist eine Möglichkeit, Code zwischen Konstruktoren zu teilen und Code lesbarer zu machen, wenn Initializer mit Variablendeklaration verwendet wird.
Der Java-Compiler kopiert Initialisierungsblöcke in jeden Konstruktor. Daher kann dieser Ansatz verwendet werden, um einen Codeblock zwischen mehreren Konstruktoren zu teilen. Oracle documentation
Der wirkliche Vorteil Instanz initializers über Konstrukteure sehen ist, wenn wir eine anonyme innere Klasse verwenden.
Anonyme innere Klassen können nicht einen Konstruktor haben (wie sie anonym sind) ,so sie eine ziemlich natürliche Ergänzung für Instanz initializers sind.
- 1. Was ist der Unterschied zwischen einem Instanzinitialisierer und einem Konstruktor?
- 2. Wie unterscheidet sich ein Client von einem Server-Peer?
- 3. Wie unterscheidet sich die Variablendeklaration zwischen `Klasse` und` Konstruktor`?
- 4. Warum unterscheidet sich ein SQL-Float von einem C# -Floss
- 5. Warum unterscheidet sich {} + [] von ({} + [])?
- 6. Wie unterscheidet sich ein Transducer von einer teilweise angewandten Funktion?
- 7. Wie unterscheidet sich das Observer-Muster von einem ereignisgesteuerten Modell?
- 8. Wie unterscheidet sich Hashtable
- 9. Wie unterscheidet sich ein Tupel von einer Klasse?
- 10. Wie unterscheidet sich eine Rendering-Plattform von einem Webbrowser?
- 11. Wie unterscheidet sich eine Schließung von einem Rückruf?
- 12. Wie unterscheidet sich async w/erwarten von einem synchronen Anruf?
- 13. Was ist ein Glom ?. Wie unterscheidet es sich von mapPartitions?
- 14. Wie unterscheidet sich ein Streaming-Operator von der verzögerten Ausführung?
- 15. Formular unterscheidet sich auf einem anderen Computer
- 16. Wie unterscheidet sich Gitlab von Github?
- 17. Wie unterscheidet sich << von +?
- 18. GCC: Wie unterscheidet sich März von Mtune?
- 19. Wie unterscheidet sich ArrayListMultimap von LinkedListMultimap?
- 20. Wie unterscheidet sich MegaStore von BigTable?
- 21. Wie unterscheidet sich Gurke von JUnit?
- 22. Wie unterscheidet sich das Armspeichermodell von ia64?
- 23. Wie unterscheidet sich mpi_file_write von mpi_file_write_all?
- 24. Farbe von NavBar unterscheidet sich von Hintergrundfarbe
- 25. ProgressDialog Nachrichtentext unterscheidet sich von AlertDialog
- 26. Was ist ein Betriebssystemkernel? Wie unterscheidet es sich von einem Betriebssystem?
- 27. Wie unterscheidet sich ein Spannweitenbaum mit minimalem Engpass von einem minimalen Spannbaum?
- 28. Perl Mantisse unterscheidet sich von anderen Doppel
- 29. Subprozess pid unterscheidet sich von ps output
- 30. Warum unterscheidet sich std :: uint32_t von uint32_t?
Instanzinitialisierer sind ziemlich selten (es sei denn, Sie stoßen auf Code von jemandem, der an der doppelten Klammersprache interessiert ist). –