在 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
被“加载”时,它会被实例化一次(不确定如何加载)发生的原因是只有一个 main 方法,并且没有构造 CompTest
对象),因此当 main()
需要 intComp
时,它是可用的无论它在源文件中的哪个位置实际定义。
即使它确实有效(出于上述原因,甚至是不同的原因)...这是不好的做法吗?
最佳答案
我相信您指的是此评论:
"The comparator definition should be before the add code – Bryan Glazer"
没有任何技术原因可以将 intComp
声明放在 main
声明之前(或之后)。无论哪种方式都可以正常工作。
将比较器放在前面的唯一可能的原因是风格。也就是说,intComp
声明是一个静态变量,并且在类的开头声明变量是常规。
我倾向于同意风格观点,但这是一个小问题。另外,如果是我,我会将比较器声明为 final
,给它一个更有意义的名称,并使用“constant”命名风格;例如INT_COMP
(但更有意义)。
Re Nambari 的评论:
"I think it is bad practice, anonymous class are for limited scope not for global scope."
这是废话。以这种方式使用匿名类是很常见的。当然,匿名类也可以在嵌套作用域中使用...这是它们的优点之一...但这绝不意味着这种模式是错误的。
关于java - 在定义之前引用匿名内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13773957/