8

二重中括弧の初期化を使用して、Javaでコレクションを初期化できることを知りました。そして、それを検索したところ、パフォーマンスの問題があるため、使用することはお勧めできません。

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

知りたいのですが、DOUBLE BRACE INITIALIZATIONの良い面や利点はありますか?

4

2 に答える 2

6

パフォーマンスの問題があるため、使用することはお勧めしません。

パフォーマンスの問題は見られません。パフォーマンス上の理由で私が何かをした/しなかったと誰かが言うのを見るときはいつでも、一方が特定の必要なパフォーマンスをどのように満たし、もう一方が満たさなかったかを説明する代替案を比較する詳細な分析を期待する必要があります。これらすべてが表示されない場合は、作成者が推測していると思われるかもしれません。

編集:各クラスの読み込みには少し時間がかかることを認めますが、実行パフォーマンスはまったく同じです。私はここでデモを行いました https://stackoverflow.com/a/14627268/57695

あなたがそれがより単純でより明確であると信じるならば、私は二重中括弧表記を使用するでしょう。

欠点は、コレクションのタイプを変更しているため、予期しない機能が混乱する可能性があることです。例:等しい。

注:Lukas Ederが指摘しているように、静的でないコンテキストでこれを行う場合は注意が必要です。匿名のサブクラスコレクションは暗黙的に外部インスタンスへの参照を持ち、コレクションよりも長く存続する場合、これはメモリリークになります。 メモリリークの可能性について考えたことはありますか?

于 2013-01-31T13:16:53.710 に答える
3

特定のパフォーマンスの問題はありません (クラスローダーを介してクラスをロードするコストを超えて - 無視できます)

上記匿名クラスを作成するthisため、周囲のインスタンスへの暗黙的な参照が含まれています。これにより、シリアル化フレームワークに混乱が生じる可能性があります。たとえば、作成した匿名クラスをシリアライズすると、突然、それを含むインスタンスもシリアライズしようとしていることに気付きます。

匿名クラスは、さまざまなフレームワークや実際の言語 (Scala - 私はあなたを見ています) の内部で多く使用できることを強調します。クラスローディングが原因で Scala のパフォーマンスに問題があると示唆する人を聞いたことがありません。最初の起動はわずかに遅くなる可能性がありますが、JVM の起動、JIT のウォームアップ、ネットワーク アクセスなどに注意してください。

クラスが増えるため、アプリケーションのフットプリントが大きくなると主張するかもしれません。私は(再び)その影響はごくわずかだと思います(匿名クラスからアプリケーション全体を構築しない限り!)

于 2013-01-31T13:19:14.237 に答える