什么时候使用匿名类?

Tam*_* G. 9 java oop anonymous-class

我遇到了一些包含匿名类的代码.我之前没有见过匿名课程,所以我对它们进行了一些研究.

我感兴趣的主要领域是java,所以我检查了Oracle的匿名类教程.我理解机制,我看到了示例的重点,但在我看来,使用匿名类会使代码难以阅读,并且会引起很多麻烦.

是否有任何情况下使用匿名类是不可避免的,或者建议使用它们而不是命名类?

Par*_*alo 10

是否有任何情况下使用匿名类是不可避免的

不,你总是可以使用私有内部类而不是Anonymous类.


使用匿名类会使代码难以阅读并导致很多麻烦

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

new Thread(new Runnable() {
    @Override
    public void run() {
        // do something
    }
}).start();
Run Code Online (Sandbox Code Playgroud)

在此示例中,您将创建一个由线程运行的Runnable.如果你不使用匿名类,你必须按如下方式编写它:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

并将其用作:

new Thread(new SomeClass()).start();
Run Code Online (Sandbox Code Playgroud)

第一种可能性是你可以直接看到该线程在做什么,在第二种可能性中你首先必须找到这里使用的类.


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

// 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();
Run Code Online (Sandbox Code Playgroud)

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


Ant*_*ton 5

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

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

上面的代码片段比定义新类更具可读性并且更短。

public class MyRunnable implements Runnable {
   public void run() {
     System.out.println("Hello world");
   }
}


void main() {
   new Thread(new MyRunnable()).start();
}
Run Code Online (Sandbox Code Playgroud)

在Java 8中,某些情况下可以使用labmda代替匿名类

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

  • @Prim 它们非常相关,但并不总是可以互换。 (3认同)
  • @biziclop 是的,但答案是“在 Java 8 中 labmda 可以用来代替匿名类”,这是不正确的。仅当它是实现函数式接口的匿名类时才是正确的 (3认同)