在a different post中,有人告诉我,在使用它的函数之后(下面)定义一个匿名内部类是错误的。但是,类似下面的内容编译并运行良好:
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);
}
};
}
官方消息是什么?我的猜测是,因为intComp
是static
,所以当类CompTest
被“加载”时它会被实例化(由于只有一个主方法,所以不确定加载是如何发生的并且没有构造CompTest
个对象),因此当main()
需要intComp
时,无论源文件在实际定义的位置如何,它都可用。
即使它确实有效(出于上述原因,甚至是不同的原因)......这是不好的做法吗?
答案 0 :(得分:5)
您正在参考此评论我相信:
“比较器定义应该在添加代码之前--Bryan Glazer”
没有技术理由在intComp
声明之前(或之后)声明main
声明。无论哪种方式都可以。
提前放置比较器的唯一可能原因是风格。也就是说,intComp
声明是静态变量,而传统是在类的开头声明变量。
我倾向于同意风格点,但这是一个小问题。另外,如果是我,我会将比较器声明为final
,给它一个更有意义的名称,并使用“常量”命名样式;例如INT_COMP
(但更有意义)。 子>
Re Nambari的评论:
“我认为这是不好的做法,匿名课程的范围有限,不适用于全球范围。”
这是胡说八道。以这种方式使用匿名类是很常见的。当然,匿名类也可以在嵌套作用域中使用......这是它们的优点之一......但这绝不意味着这个模式是错误的。