我正在读一本书,其中作者使用了这样的代码
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
关键字?
由于
答案 0 :(得分:5)
作者正在使用一个名为anonymous class的特殊构造,它使用以下语法定义:
new interface-name () { class-body }
答案 1 :(得分:1)
在定义命名类时,只需要implements
在这种情况下,作者使用匿名(未命名)内部类来实现接口。
编辑:对于背景,许多人不了解/欣赏的是编译器将为匿名内部类生成.class文件。 例如以下代码生成Fred.class文件和Fred $ 1.class文件:
public class Fred {
public void sayHelloFred() {
Object o = new MouseAdapter() {
};
}
}
所有这些.class文件仍然需要在运行时加载和加载,就像它们被命名为类一样。
答案 2 :(得分:0)
您正在此处创建一个匿名类。不需要implements关键字。请注意,在这种情况下,您使用新的PoolObjectFactory,这清楚地表明您正在实现的类 - 无需再使用工具再次指示它。
另一方面,如果要创建子类,则需要说明它是哪个父接口,然后需要implements关键字。
答案 3 :(得分:0)
作者使用匿名类。在这种情况下,创建一个没有标识符的类,只创建一个实例并将其分配给factory
变量。
答案 4 :(得分:0)
在定义类时,使用implements关键字来指示该类将满足接口的要求。在该行中,作者实例化一个匿名类。