0

另一篇文章中,有人告诉我,在使用它的函数“之后”(下)定义一个匿名内部类是错误的。但是,类似下面的内容编译并运行良好:

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被“加载”时它会被实例化一次(不确定加载是如何发生的,因为只有一个 main 方法并且没有CompTest构造对象),因此当main()需要时intComp,它是可用的不管它在源文件中的哪个位置被实际定义。

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

4

1 回答 1

5

您指的是我相信的此评论:

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

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

将比较器放在更早的唯一可能原因是风格。也就是说,intComp声明是一个静态变量通常在类的开头声明变量。

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


Re Nambari 的评论:

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

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

于 2012-12-08T02:56:15.057 回答