0

別の投稿で、匿名の内部クラスをそれを使用する関数の「後」(下)に定義するのは間違っていると言われました。ただし、以下のようなものはコンパイルされ、正常に実行されます。

public class CompTest {

    public static void main(String[] args) {
        TreeSet<Integer> ts = new TreeSet<Integer>(intComp);
        ts.add(1);
        ts.add(2);
        ts.add(3);
        System.out.println(ts.toString());
    }

    private static Comparator<Integer> intComp = new Comparator<Integer>() {
        @Override
        public int compare(Integer i1, Integer i2) {
            return i2.compareTo(i1);
        }
    };

}

これに関する公式の言葉は何ですか?私の推測では、はであるためintCompstaticクラスCompTestが「ロード」されるときに1回インスタンス化されます(メインメソッドのみがあり、CompTestオブジェクトが構築されていないため、そのロードがどのように行われるかは正確にはわかりません)。したがって、main()必要に応じintCompて使用できます。ソースファイルのどこで実際に定義されたかに関係なく。

そして、それが機能するとしても(上記の理由または別の理由で)...それは悪い習慣ですか?

4

1 に答える 1

5

あなたは私が信じるこのコメントを参照しています:

「コンパレータの定義は、追加コードの前にある必要があります–BryanGlazer」

intComp宣言の前(または後に)に宣言を置く技術的な理由はありませんmain。どちらの方法でも問題なく動作します。

コンパレータを早く配置する唯一の考えられる理由は、文体です。つまり、intComp宣言は静的変数であり、クラスの開始時に変数を宣言するの が一般的です。

私はスタイルポイントに同意する傾向がありますが、それはマイナーな問題です。また、それが私である場合は、コンパレータをとして宣言しfinal、より意味のある名前を付けて、「一定の」命名スタイルを使用します。例INT_COMP(ただし、より意味があります)。


Re Nambariのコメント:

「これは悪い習慣だと思います。匿名クラスは、グローバルスコープではなく、限定スコープ用です。」

これはナンセンスです。匿名クラスがこのように使用されることは非常に一般的です。確かに、匿名クラスはネストされたスコープでも使用できます...そしてそれはそれらの利点の1つです...しかしそれは決してこのパターンが間違っていることを意味するものではありません。

于 2012-12-08T02:56:15.057 に答える