什么时候使用匿名类?
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
我 运行 进入一些包含匿名 类 的代码。我以前没有见过匿名的类,所以我对他们做了一些研究。
我主要感兴趣的领域是 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