The*_*111 0 java anonymous-inner-class
在另一篇文章中,我被告知在一个使用它的函数之后(下面)定义一个匿名内部类是错误的.但是,类似下面的东西编译并运行正常:
public class CompTest {
public static void main(String[] args) {
TreeSet<Integer> ts = new TreeSet<Integer>(intComp);
ts.add(1);
ts.add(2);
ts.add(3);
System.out.println(ts.toString());
}
private static Comparator<Integer> intComp = new Comparator<Integer>() {
@Override
public int compare(Integer i1, Integer i2) {
return i2.compareTo(i1);
}
};
}
Run Code Online (Sandbox Code Playgroud)
官方消息是什么?我的猜测是,既然intComp
是static
,那么当类CompTest
被"加载" 时它被实例化一次(由于只有一个主方法并且没有CompTest
构造任何对象,因此不确定该加载是如何发生的),因此当main()
需要时intComp
,它是可用的无论源文件在何处实际定义.
即使它确实有效(出于上述原因,甚至是不同的原因)......这是不好的做法吗?
你是在参考这个评论我相信:
"比较器定义应该在添加代码之前--Bryan Glazer"
在intComp
声明之前(或之后)main
声明声明没有技术理由.无论哪种方式都可以.
提前放置比较器的唯一可能原因是风格.也就是说,intComp
声明是一个静态变量,并且在类的开头声明变量是常规的.
我倾向于同意风格点,但这是一个小问题.另外,如果是我,我会将比较器声明为final
,给它一个更有意义的名称,并使用"常量"命名样式; 例如INT_COMP
(但更有意义).
Re Nambari的评论:
"我认为这是不好的做法,匿名课程的范围有限,不适用于全球范围."
这是无稽之谈.以这种方式使用匿名类是很常见的.当然,匿名类也可以在嵌套作用域中使用......这是它们的优点之一......但这绝不意味着这种模式是错误的.