在定义之前引用匿名内部类

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)

官方消息是什么?我的猜测是,既然intCompstatic,那么当类CompTest被"加载" 时它被实例化一次(由于只有一个主方法并且没有CompTest构造任何对象,因此不确定该加载是如何发生的),因此当main()需要时intComp,它是可用的无论源文件在何处实际定义.

即使它确实有效(出于上述原因,甚至是不同的原因)......这是不好的做法吗?

Ste*_*n C 5

你是在参考这个评论我相信:

"比较器定义应该在添加代码之前--Bryan Glazer"

intComp声明之前(或之后)main声明声明没有技术理由.无论哪种方式都可以.

提前放置比较器的唯一可能原因是风格.也就是说,intComp声明是一个静态变量,并且在类的开头声明变量是常规的.

我倾向于同意风格点,但这是一个小问题.另外,如果是我,我会将比较器声明为final,给它一个更有意义的名称,并使用"常量"命名样式; 例如INT_COMP(但更有意义).


Re Nambari的评论:

"我认为这是不好的做法,匿名课程的范围有限,不适用于全球范围."

这是无稽之谈.以这种方式使用匿名类是很常见的.当然,匿名类可以在嵌套作用域中使用......这是它们的优点之一......但这绝不意味着这种模式是错误的.