2013-01-31 5 views
7

Nous savons que nous pouvons initialiser une collection dans Java en utilisant l'initialisation double accolade. Et a fait des recherches sur ce point et a constaté qu'il n'est pas conseillé de l'utiliser en raison de son problème de performance.Initialisation double accolade - Avantage

private static final Set<String> VALID_CODES = new HashSet<String>() {{ 
    add("XZ13s"); 
    add("AB21/X"); 
    add("YYLEX"); 
    add("AR2D"); 
}}; 

Je veux juste savoir, y at-il un côté positif ou un avantage de l'INITIALISATION DOUBLE BRACE ??

+0

Non, seul le côté positif est moins de code .. mais pas lisible par tous les autres qui ne sont pas conscients de l'initialisation double accolade. – Phani

+2

Bien que plus lisibles par des personnes capables de programmer en Java, dans un contexte non-statique, vous allez chercher une référence à 'ceci'. Vous pouvez également récupérer des références fixes aux champs finaux que vous utilisez lors de l'appel des mutateurs. Ce ne sera pas évident pour la plupart des programmeurs Java, et pourrait bien conduire à des problèmes de mémoire obscurs. // Quoi qu'il en soit, vous devriez écrire quelque chose comme 'private static final Set VALID_CODES = Collections.unmodifiableSet (nouveau HashSet (Tableaux.asList ("XZ13s", "AB21/X", "YYLEX", "AR2D"))); ', évidemment. –

Répondre

5

conseillé de ne pas l'utiliser en raison de ses problèmes de performance.

Je ne vois aucun problème de performance. Chaque fois que vous voyez quelqu'un dire que j'ai fait/n'ai pas fait quelque chose pour des raisons de performance, vous devriez vous attendre à voir une analyse détaillée comparant les alternatives expliquant comment on a rencontré la performance spécifique requise et l'autre pas. Si vous ne voyez pas tout cela, vous pouvez supposer que l'auteur ne fait que deviner.

EDIT: Bien que je concède que chaque classe prend un peu de temps à charger, la performance en cours d'exécution est exactement la même. J'ai démontré ici https://stackoverflow.com/a/14627268/57695

Je voudrais utiliser la notation double accolade si vous croyez que c'est plus simple et plus clair.

Un inconvénient est que vous changez le type de la collection qui peut confondre les fonctions où cela n'est pas prévu. par exemple. équivaut à.

Remarque: Comme le souligne Lukas Eder, vous devez faire attention si vous le faites dans un contexte non statique. La collection de sous-classes anonymes aura implicitement une référence à l'instance externe et si elle vit plus longtemps que la collection, ce serait une fuite de mémoire. Have you ever thought of the possibility of a memory leak?

+1

La question [Efficacité de Java "Initialisation Double Brace"?] (Http://stackoverflow.com/questions/924285/efficiency-of-java-double-brace-initialization) a effectivement parlé du problème de performance, et il * est * Ralentissez. –

+2

@AlvinWong Ce test semble être assez cassé - en particulier, chaque fois que je vois un test renvoyant "0 ms", ma première estimation est que le code n'a pas été exécuté (ce qui serait totalement légal dans ce cas car les résultats ne sont jamais utilisé). De plus, la JVM n'est pas bien chauffée ... Je ne ferais pas confiance à ces résultats. – assylias

+0

La réponse en haut sur le fil ci-dessus a quelques commentaires remettant en cause les mesures de performance –

2

Il n'y a pas question de performance particulière (au-delà du coût de chargement d'une classe par le classloader - négligeable)

ci-dessus ne créer une classe anonyme et en tant que tel, il contient une this implicite référence à l'instance entourant . Cela peut causer une certaine confusion pour les cadres de sérialisation. par exemple. vous sérialiserez la classe anonyme que vous avez créée, et vous découvrirez soudain que vous essayez également de sérialiser l'instance contenant.

Je voudrais souligner que les cours anonymes peuvent être beaucoup utilisés sous les couvertures dans différents cadres et en effet des langages (Scala - je vous regarde). Je n'ai jamais entendu quelqu'un suggérer que Scala a des problèmes de performance en raison de la charge de classe. Première mise en service peut être très légèrement plus lent, mais gardez à l'esprit démarrage JVM, JIT warm-up, tout accès réseau etc.

Vous pourriez arguer que votre empreinte demande est plus grande, en raison de plusieurs classes. Je suspecte (encore) l'effet est négligeable (sauf si vous construisez une application entière de classes anonymes!)

+0

Exactement où avons-nous une classe anonyme ici? –

+0

J'ai répondu à @Peter au sujet de la charge de classe - ce n'est pas toujours négligeable. Bien sûr, le coût est O (1) car il est utilisé uniquement dans l'initialisation de la classe. – bestsss

+0

En dehors de la sérialisation, la simple possibilité de créer une fuite de mémoire de cette façon est beaucoup plus grave IMO ... –