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

时间:2012-12-08 02:48:10

标签: java anonymous-inner-class

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);
        }
    };

}

官方消息是什么?我的猜测是,因为intCompstatic,所以当类CompTest被“加载”时它会被实例化(由于只有一个主方法,所以不确定加载是如何发生的并且没有构造CompTest个对象),因此当main()需要intComp时,无论源文件在实际定义的位置如何,它都可用。

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

1 个答案:

答案 0 :(得分:5)

您正在参考此评论我相信:

  

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

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

提前放置比较器的唯一可能原因是风格。也就是说,intComp声明是静态变量,而传统是在类的开头声明变量。

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


Re Nambari的评论:

  

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

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