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)
您可以使用在定义匿名类的代码中声明的常量.如果您使用私有内部类,则必须将这些常量提供给类的构造函数才能使用它们!
您始终可以通过隐式定义新类来避免使用匿名类。然而,在某些情况下,最好使用匿名类。考虑以下示例:
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)