In Java Gizli Özellikleri üst cevabı bahseder Çift Ayraç Başlatma bir ile, çok cazip sözdizimi:
Set<String> flavors = new HashSet<String>() {{
add("vanilla");
add("strawberry");
add("chocolate");
add("butter pecan");
}};
Bu deyim, içinde yalnızca "içerme kapsamındaki herhangi bir [...] yöntemi kullanabilen" bir örnek başlatıcısı olan anonim bir iç sınıf oluşturur.
Ana soru: Bu göründüğü kadar verimsiz mi? Kullanımı bir kerelik başlatmalarla sınırlandırılmalı mıdır? (Ve elbette gösteriş!)
İkinci soru: Yeni HashSet, örnek başlatıcıda kullanılan "bu" olmalıdır ... herkes mekanizmaya ışık tutabilir mi?
Üçüncü soru: Bu deyim üretim kodunda kullanmak için çok belirsiz mi?
Özet: Çok, çok güzel cevaplar, herkese teşekkürler. Soru (3) üzerinde, insanlar sözdiziminin açık olması gerektiğini hissettiler (özellikle de kodunuz size aşina olmayabilecek geliştiricilere geçecekse, ara sıra bir yorum öneririm).
Soru (1) 'de, oluşturulan kod hızlı bir şekilde çalışmalıdır. Ekstra .class dosyaları jar dosyası dağınıklığına ve programın yavaş başlatılmasına neden olur (bunu ölçmek için @coobird sayesinde). @Thilo, çöp toplama işleminin etkilenebileceğine ve fazladan yüklenmiş sınıfların bellek maliyetinin bazı durumlarda bir faktör olabileceğine dikkat çekti.
Soru (2) benim için en ilginç oldu. Yanıtları anlarsam, DBI'de olan şey, anonim iç sınıfın yeni işleç tarafından oluşturulan nesnenin sınıfını genişletmesidir ve bu nedenle, oluşturulan örneği referans alan bir "bu" değere sahip olmasıdır. Çok temiz.
Genel olarak, DBI bana entelektüel bir merak olarak bakıyor. Coobird ve diğerleri, Arrays.asList, varargs yöntemleri, Google Collections ve önerilen Java 7 Collection değişmez değerleri ile aynı etkiyi elde edebileceğinizi belirtiyor. Scala, JRuby ve Groovy gibi daha yeni JVM dilleri de liste yapımı için kısa gösterimler sunar ve Java ile birlikte çalışır. DBI sınıf yolunu kümeler, sınıf yükleme biraz yavaşlatır ve kodu biraz daha karanlık hale getirir, muhtemelen ondan uzak utangaç. Bununla birlikte, bunu SCJP'sini yeni alan ve Java semantiği hakkında iyi huylu jousts seven bir arkadaşa yaymayı planlıyorum! ;-) Herkese teşekkürler!
7/2017: Baeldung , çift ayraç başlatmanın iyi bir özetine sahip ve bunu bir anti-desen olarak görüyor.
12/2017: @Basil Bourque, yeni Java 9'da şunları söyleyebileceğinizi söylüyor:
Set<String> flavors = Set.of("vanilla", "strawberry", "chocolate", "butter pecan");
Bu kesin yol. Önceki bir sürüme sahipseniz Google Koleksiyonlar'ın ImmutableSet'ine göz atın .
Set<String> flavors = Set.of( "vanilla" , "strawberry" , "chocolate" , "butter pecan" ) ;
flavors
bir olmakHashSet
, ama ne yazık ki o anonim bir alt sınıfıdır.