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

标签 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 被“加载”时,它会被实例化一次(不确定如何加载)发生的原因是只有一个 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/

相关文章:

java - 匿名内部类实际上不是子类吗?

java - ListView setCellFactory 会搞乱绑定(bind),除非匿名内部类?

java - 如何解决内部类的循环依赖?

java - 非唯一字段上的 Hibernate ManyToMany 关联

java - 使用 VpnService 的 Android http 隧道

java - 无法直接在 JFrame 上绘画

java - 不存在的隐藏Java内部类之谜

java - 从 Spark 到速度

java - Apache Pivot 是 Swing 的合适替代品吗?

java - 具有内部类和最终变量的线程化 Java 服务器