8

「 Head First Java 」という本を読んでいて、ある時点で、内部クラスのインスタンスを外部クラスのインスタンスに関連付ける必要があると述べていましたが、これはすでに知っていましたが、例外があります。

非常に特殊なケースです。<strong>静的メソッド内で定義された内部クラスです。しかし、これらのいずれにも遭遇することなく、Java の一生を過ごすことになるかもしれません。

最後のステートメントが実際に正しいと確信していますが、コンパイラがそれを許可する場合、それは何らかの理由で存在することを意味し、そうでない場合は違法な Java になります。これが役立つ場所の例を誰かに見せてもらえますか?

4

4 に答える 4

3

特別かもしれないし、そうじゃないかもしれない。

メソッド内で使用可能なローカル クラスを見ています。

class Foo {
    static void bar(){
       class MyRunnable implements Runnable {
           public void run() {
               System.out.println("No longer anonymous!");
           }    
        };
       Thread baz = new Thread(new MyRunnable());
    }

}

次のような匿名の内部クラスの使用を見てきました。

class Foo {
    static void bar(){
        Thread baz=new Thread(new Runnable(){
            public void run(){
                System.out.println("quux");
            }
        }
    }
}

これは技術的には内部クラス (匿名ですが) であり、静的メソッドで定義されています。個人的には、Runnable を実装するネストされた静的クラスを作成して、次のようにします。

baz = new Thread(new MyRunnable());

は次のようにMyRunnable定義されます。

class Foo {
    static void bar(){
       // SNIP
    }
    static class MyRunnable implements Runnable {
        public void run() {
            System.out.println("No longer anonymous!");
        }    
    }
}
于 2013-10-22T19:30:01.420 に答える
1

一部の人々は、静的にできるメソッドはすべて静的であるべきだと考えています。そのような人にとって、クラスの内面の美しさはそれほど重要ではありません。

于 2013-10-22T20:27:19.530 に答える
1

これは、静的メソッド内の内部クラスの作成例です。と主張できる

  1. 他の場所では必要ないため、静的メソッドの外部で宣言する必要はありません
  2. 複数回使用されるため、名前付きクラス (つまり、匿名ではない) である必要があります。

    class Race {
        public static void main(String[] args) throws Exception{
            class Runner implements Runnable {
                final String name;
                long time = -1;
                Runner(String name) { this.name = name; }
                public void run() {
                    try {
                        long start = System.currentTimeMillis();
                        time = -2;
                        System.out.printf("Start %s\n", name);
                        for (int i = 0; i < 10; i++) {
                            Thread.sleep(1000);
                        }
                        System.out.printf("End %s\n", name);
                        this.time = System.currentTimeMillis() - start;
                    } catch (InterruptedException e) {
                        time = -3;
                    }
                }
                long time() { return time; }
            }                
            Runner r1 = new Runner("One");
            Runner r2 = new Runner("Two");
            Thread one = new Thread(r1);
            Thread two = new Thread(r2);
            one.start();
            two.start();
            one.join();
            two.join();
            System.out.printf("One: %s, Two: %s\n", r1.time(), r2.time());
            System.out.printf("%s wins\n", r1.time() < r2.time() ? "one" : "two");
        }
    }
    
于 2013-10-22T20:40:01.683 に答える
0

完全なコンテキストはわかりませんが、クロージャー (つまり、Guava のFunction実装) とユーティリティ クラスで定義された実装が例になる可能性があります。

ただし、しばらく検索した後、グアバ自体に匿名のクロージャーの例は見つかりませんでした。

于 2013-10-22T20:37:49.207 に答える