我正在阅读《Effective Java 2 - Item 22》,标题中写道:
"Favor static member classes over non-static"
但在本章末尾
Implementations of the collection interfaces, such as Set and List, typically use nonstatic member classes to implement their iterators:
// Typical use of a nonstatic member class
public class MySet<E> extends AbstractSet<E> {
... // Bulk of the class omitted
public Iterator<E> iterator() {
return new MyIterator();
}
private class MyIterator implements Iterator<E> {
...
}
}
我做了一个测试程序,看看它们之间是否有任何区别,这就是。
public class JavaApplication7 {
public static void main(String[] args) {
// TODO code application logic here
JavaApplication7 t = new JavaApplication7();
Inner nonStaticObject = t.getAClass();
Sinner staticObject = new JavaApplication7.Sinner();
nonStaticObject.testIt();
staticObject.testIt();
}
public Inner getAClass(){
return new Inner();
}
static class Sinner{
public void testIt(){
System.out.println("I am inner");
}
}
class Inner{
public void testIt(){
System.out.println("I am inner");
}
}
}
输出为
I am inner I am inner
所以,他们做了同样的工作。
我想知道为什么在这个例子中使用非静态类?
最佳答案
迭代器通常需要首先引用用于创建它的集合。您可以使用显式提供对集合的引用的静态嵌套类来做到这一点 - 或者您可以只使用隐式具有该引用的内部类。
基本上,如果嵌套类的每个实例都需要封闭类的实例来操作(并且该实例不会更改),那么您不妨将其设为内部类。否则,使其成为静态嵌套类。
关于java - 静态内部类和非静态内部类的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17514712/