什么时候使用匿名类?

When to use anonymous classes?

我 运行 进入一些包含匿名 类 的代码。我以前没有见过匿名的类,所以我对他们做了一些研究。

我主要感兴趣的领域是 java,所以我检查了 Oracle's tutorial of anonymous classes. 我理解这个机制并且我明白了示例的意义,但在我看来使用匿名 类代码难以阅读并且会引起很多麻烦。

是否存在不可避免地使用匿名 类 或建议使用匿名 类 而不是匿名 类 的情况?

您始终可以通过隐式定义新的 class 来避免使用匿名 classes。但是在某些情况下,最好使用匿名 classes。考虑以下示例:

void main() {
   new Thread(new Runnable(){
      public void run() {
        System.out.println("Hello world");
      }
   }).start();
}

上面的代码片段比定义新的 class.

更易读且更短
public class MyRunnable implements Runnable {
   public void run() {
     System.out.println("Hello world");
   }
}


void main() {
   new Thread(new MyRunnable()).start();
}

在Java8 labmda中可以代替匿名class在某些情况下

Runnable task = () -> { System.out.println("hello world"); };
new Thread(task).start();

Are there any cases when it is unavoidable to use anonymous classes

不,您始终可以只使用私有内部 class 而不是匿名 class。


using anonymous classes makes the code hard to read and can cause a lot of headache

这在很大程度上取决于您如何使用匿名 classes。考虑以下示例:

new Thread(new Runnable() {
    @Override
    public void run() {
        // do something
    }
}).start();

在此示例中,您创建了一个由线程 运行 运行的 Runnable。如果您不使用匿名 class,则必须按如下方式编写:

private class SomeClass implements Runnable {
    @Override
    public void run() {
        // TODO Auto-generated method stub

    }
}

并将其用作:

new Thread(new SomeClass()).start();

对于第一种可能性,您可以直接看到该线程在做什么,在第二种可能性中,您首先必须找到此处使用的 class。


匿名的另一个优点classes.您可以执行以下操作:

// define some constant which can be used in the anonymous class:
final String someStr = "whatever";

new Thread(new Runnable() {
    @Override
    public void run() {
        // use the String someStr directly
        System.out.println(someStr);
    }
}).start();

您可以使用在定义匿名 class 的代码中声明的常量。如果您要使用私有内部 class,则必须将这些常量提供给 class 的构造函数才能使用它们!

Are there any cases when it is unavoidable to use anonymous classes...

没有。您总是可以为此定义一个命名的 class 。 annonymous classes 的目的是在只需要使用一次 class 的情况下使代码更加简洁和紧凑。

it is advised to use them instead of named classes?

这取决于正在创建的 class 的上下文。

如果您正在实现只有一个函数(即 Runnable)的接口,那么使用 lambda 表达式而不是匿名 classes 是一个不错的选择。 lamba expression