In Hidden Features of Java wird in der Top-Antwort die Double Brace-Initialisierung mit einer sehr verlockenden Syntax erwähnt:
Set<String> flavors = new HashSet<String>() {{
add("vanilla");
add("strawberry");
add("chocolate");
add("butter pecan");
}};
Diese Redewendung erstellt eine anonyme innere Klasse mit nur einem Instanzinitialisierer, die "beliebige [...] Methoden im enthaltenen Bereich verwenden kann".
Hauptfrage: Ist das so ineffizient, wie es sich anhört? Sollte seine Verwendung auf einmalige Initialisierungen beschränkt sein? (Und natürlich angeben!)
Zweite Frage: Das neue HashSet muss das "Dies" sein, das im Instanzinitialisierer verwendet wird ... kann jemand Licht in den Mechanismus bringen?
Dritte Frage: Ist diese Redewendung zu dunkel , um sie im Produktionscode zu verwenden?
Zusammenfassung: Sehr, sehr schöne Antworten, danke an alle. Bei Frage (3) waren die Leute der Meinung, dass die Syntax klar sein sollte (obwohl ich gelegentlich einen Kommentar empfehlen würde, insbesondere wenn Ihr Code an Entwickler weitergegeben wird, die möglicherweise nicht damit vertraut sind).
Bei Frage (1) sollte der generierte Code schnell ausgeführt werden. Die zusätzlichen .class-Dateien verursachen Unordnung in der JAR-Datei und verlangsamen den Programmstart geringfügig (danke an @coobird für die Messung). @Thilo wies darauf hin, dass die Speicherbereinigung betroffen sein kann und die Speicherkosten für die zusätzlich geladenen Klassen in einigen Fällen ein Faktor sein können.
Frage (2) erwies sich für mich als am interessantesten. Wenn ich die Antworten verstehe, passiert in DBI, dass die anonyme innere Klasse die Klasse des Objekts erweitert, das vom neuen Operator erstellt wird, und daher einen "this" -Wert hat, der auf die zu erstellende Instanz verweist. Sehr gepflegt.
Insgesamt erscheint mir DBI als eine Art intellektuelle Neugier. Coobird und andere weisen darauf hin, dass Sie mit Arrays.asList, varargs-Methoden, Google Collections und den vorgeschlagenen Java 7 Collection-Literalen denselben Effekt erzielen können. Neuere JVM-Sprachen wie Scala, JRuby und Groovy bieten auch präzise Notationen für die Listenerstellung und arbeiten gut mit Java zusammen. Angesichts der Tatsache, dass DBI den Klassenpfad überfüllt, das Laden der Klasse etwas verlangsamt und den Code etwas dunkler macht, würde ich mich wahrscheinlich davor scheuen. Ich habe jedoch vor, dies einem Freund zu überlassen, der gerade seinen SCJP erhalten hat und gutmütige Turniere über Java-Semantik liebt! ;-) Danke an alle!
7/2017: Baeldung hat eine gute Zusammenfassung der Doppelklammerinitialisierung und betrachtet sie als Anti-Muster.
12/2017: @Basil Bourque stellt fest, dass Sie im neuen Java 9 sagen können:
Set<String> flavors = Set.of("vanilla", "strawberry", "chocolate", "butter pecan");
Das ist sicher der richtige Weg. Wenn Sie mit einer früheren Version nicht weiterkommen , schauen Sie sich das ImmutableSet von Google Collections an .
Set<String> flavors = Set.of( "vanilla" , "strawberry" , "chocolate" , "butter pecan" ) ;
flavors
, ein zu seinHashSet
, aber leider ist es eine anonyme Unterklasse.