Dans les fonctions cachées de Java, la première réponse mentionne l' initialisation à double accolade , avec une syntaxe très séduisante:
Set<String> flavors = new HashSet<String>() {{
add("vanilla");
add("strawberry");
add("chocolate");
add("butter pecan");
}};
Cet idiome crée une classe interne anonyme avec juste un initialiseur d'instance, qui "peut utiliser n'importe quelle méthode [...] dans la portée contenante".
Question principale: est-ce aussi inefficace que cela puisse paraître? Son utilisation doit-elle être limitée à des initialisations ponctuelles? (Et bien sûr, exhibant!)
Deuxième question: le nouveau HashSet doit être le "ceci" utilisé dans l'initialiseur d'instance ... quelqu'un peut-il faire la lumière sur le mécanisme?
Troisième question: cet idiome est-il trop obscur pour être utilisé dans le code de production?
Résumé: Très, très belles réponses, merci à tous. À la question (3), les gens ont estimé que la syntaxe devrait être claire (bien que je recommanderais un commentaire occasionnel, surtout si votre code est transmis aux développeurs qui ne le connaissent peut-être pas).
Sur la question (1), le code généré doit s'exécuter rapidement. Les fichiers .class supplémentaires provoquent un encombrement des fichiers jar et ralentissent légèrement le démarrage du programme (merci à @coobird d'avoir mesuré cela). @Thilo a souligné que la récupération de place peut être affectée, et le coût de la mémoire pour les classes supplémentaires chargées peut être un facteur dans certains cas.
La question (2) s'est avérée être la plus intéressante pour moi. Si je comprends les réponses, ce qui se passe dans DBI est que la classe interne anonyme étend la classe de l'objet en cours de construction par le nouvel opérateur, et a donc une valeur "this" faisant référence à l'instance en cours de construction. Très propre.
Dans l'ensemble, DBI me semble être une sorte de curiosité intellectuelle. Coobird et d'autres soulignent que vous pouvez obtenir le même effet avec Arrays.asList, les méthodes varargs, Google Collections et les littéraux Java 7 Collection proposés. Les langages JVM plus récents comme Scala, JRuby et Groovy offrent également des notations concises pour la construction de listes et interagissent bien avec Java. Étant donné que DBI encombre le chemin de classe, ralentit un peu le chargement des classes et rend le code un peu plus obscur, je préfèrerais probablement l'éviter. Cependant, je prévois de lancer ceci sur un ami qui vient de recevoir son SCJP et aime les joutes de bonne nature sur la sémantique Java! ;-) Merci tout le monde!
7/2017: Baeldung a un bon résumé de l'initialisation à double accolade et le considère comme un anti-modèle.
12/2017: @Basil Bourque note que dans le nouveau Java 9 vous pouvez dire:
Set<String> flavors = Set.of("vanilla", "strawberry", "chocolate", "butter pecan");
C'est à coup sûr la voie à suivre. Si vous êtes bloqué avec une version antérieure, jetez un œil à ImmutableSet de Google Collections .
Set<String> flavors = Set.of( "vanilla" , "strawberry" , "chocolate" , "butter pecan" ) ;
flavors
à être unHashSet
, mais hélas c'est une sous-classe anonyme.