什么时候使用匿名类?

时间:2015-11-30 11:06:48

标签: java oop anonymous-class

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

我感兴趣的主要领域是java,所以我检查Oracle's tutorial of anonymous classes.我理解机制并且我看到了示例的重点,但在我看来,使用匿名类会使代码难以阅读并且可能会导致很多头痛。

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

3 个答案:

答案 0 :(得分:9)

  

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

的情况

不,你总是可以使用私有内部类而不是匿名类。

  

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

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

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

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

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

    }
}

并将其用作:

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

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

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

// 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();

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

答案 1 :(得分:4)

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

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

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

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


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

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

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

答案 2 :(得分:2)

  

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

没有。你总是可以为它定义一个命名类。匿名类的要点是在您只需要使用一次类的情况下使代码更简洁和紧凑。

  

建议使用它们而不是命名类?

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

如果你实现的接口只有一个函数(即Runnable),那么使用lambda表达式代替匿名类并不是一个糟糕的选择。  lamba expression