1

著者がこのようなコードを使用した本を読んでいます

public class Pool<T> {

    public interface PoolObjectFactory<T> {     
        public T createObject();        
     } 

    private final List<T> freeObjects;
    private final PoolObjectFactory<T> factory;
    private final int maxSize;

    public Pool(PoolObjectFactory<T> factory, int maxSize) {

        this.factory = factory;
        this.maxSize = maxSize;
        this.freeObjects = new ArrayList<T>(maxSize);

    } //end of constructor

} //end of class Pool<T>

それから彼はこのようなコードを使用しました

PoolObjectFactory<KeyEvent> factory = new PoolObjectFactory<KeyEvent>() {

    @Override
    public KeyEvent createObject() {                
        return new KeyEvent();                          
    } //end of createObject()

};

keyEventPool = new Pool<KeyEvent>(factory, 100);

PoolObjectFactory<KeyEvent> factory = new PoolObjectFactory<KeyEvent>() {..};彼が言わなかったセリフで聞きたいimplements PoolObjectFactory。なんで?インターフェイスを使用するときは、implementsキーワードを使用しますか?

ありがとう

4

5 に答える 5

5

作成者は、次の構文を使用して定義される匿名クラスと呼ばれる特別な構成を使用しています。

new interface-name () { class-body }
于 2012-06-22T13:32:20.183 に答える
1

implements名前付きクラスを定義する場合にのみ必要です。
この場合、作成者はインターフェイスを実装する匿名 (名前のない) 内部クラスを使用しています。

編集:背景として、多くの人が気付いていない/認識していないことは、コンパイラが匿名の内部クラスの .class ファイルを生成することです。たとえば、次の例では Fred.class ファイルと Fred$1.class ファイルが生成されます。

public class Fred {
    public void sayHelloFred() {
        Object o = new MouseAdapter() {
        };
    }
}

これらの .class ファイルはすべて、名前が付けられたクラスの場合と同様に、実行時に出荷してロードする必要があります。

于 2012-06-22T13:32:00.600 に答える
0

ここで匿名クラスを作成しています。implements キーワードは必要ありません。この場合、new PoolObjectFactory を使用しており、これは実装しているクラスを明確に示していることに注意してください。implements を使用してもう一度それを示す必要はありません。

一方、サブクラスを作成している場合は、どれが親インターフェイスであるかを述べる必要があり、次にimplementsキーワードが必要です。

于 2012-06-22T13:32:58.217 に答える
0

作成者は匿名クラスを使用します。このような場合、クラスは識別子なしで作成され、インスタンスが 1 つだけ作成されてfactory変数に割り当てられます。

于 2012-06-22T13:33:28.530 に答える
0

クラスを定義するときは、implements キーワードを使用して、クラスがインターフェイスの要件を満たすことを示します。問題の行で、作成者は無名クラスをインスタンス化します。

于 2012-06-22T13:34:13.217 に答える