在Java中使用匿名类被认为是坏的还是好的?[已关闭]

2022-09-01 03:39:21

我知道匿名类在实现Lister和类似的东西时节省了打字。它们试图替代闭包的某些用法。

但是社区如何看待这种语言功能的价值呢?它是否有意义,您是否经常使用它?它是否使代码更清晰,更易于理解和更易于维护?还是匿名类使代码的可读性降低?

你有什么意见,请准备好例子/论据来支持你的观点?


答案 1

我倾向于使用匿名的内部类,在我不需要有一个完整的类只是为了执行一些任务的情况下。例如,如果我想实现一个 or ,但我认为没有必要有一个内部类。例如,对于启动一个简单的 ,使用匿名内部类可能更具可读性:ActionListenerRunnableThread

public void someMethod()
{
    new Thread(new Runnable() {
        public void run()
        {
            // do stuff
        }
    }).start();
}

在某些情况下,例如上面的示例,它可以提高可读性,特别是对于一次性任务,因为要执行的代码全部写在一个位置。使用内部类将“去本地化”代码:

public void someMethod()
{
    new Thread(new MyRunnable()).start();
}

// ... several methods down ... //

class MyRunnable implements Runnable
{
    public void run()
    {
        // do stuff
    }
}

然而,话虽如此,如果出现同样的事情将要重复的情况,它确实应该是一个单独的类,无论是常规类还是内部类。

我倾向于在程序中使用匿名内部类,我只是在尝试一些事情,而不是将其作为实际应用程序的核心功能。


答案 2

匿名内部类的另一个很好的用途是当你需要初始化像ArrayList和Set这样的集合时。这种做法也称为双大括号初始化 例如,

private static final Set<String> VALID_CODES = new HashSet<String>() {{
add("XZ13s");
add("AB21/X");
add("YYLEX");
add("AR2D");
}};

显然,这不仅限于收藏;它可以用来初始化任何类型的对象 - 例如Gui对象:

 add(new JPanel() {{
setLayout(...);
setBorder(...);
add(new JLabel(...));
add(new JSpinner(...));
}});