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 关键字。请注意,在这种情况下,您使用新的 PoolObjectFactory,这清楚地表明了您正在实现的类 - 无需使用工具再次表明它。

另一方面,如果您要创建子类,则需要说明它是父接口,然后您需要 implements 关键字。

于 2012-06-22T13:32:58.217 回答
0

作者使用了一个匿名类。在这种情况下,创建一个没有标识符的类,并且只创建一个实例并将其分配给factory变量。

于 2012-06-22T13:33:28.530 回答
0

在定义一个类时使用implements关键字来表示该类将满足接口的要求。在有问题的行中,作者实例化了一个匿名类。

于 2012-06-22T13:34:13.217 回答