我是 Java 新手。我正在阅读玩具代码,并注意到所有其他方法期望“启动”和“停止”方法都是静态的。由于这个“stop”只能通过“.this.stop()”(“here”行)调用。这样的实现有什么好处,为什么不让“start”和“stop”也成为静态方法呢?
public class MyService {
private MyService() {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
try {
MyService.this.stop(); <----- here
} catch (IOException | InterruptedException e) {
...
}
}
});
}
protected void stop() {
....
}
protected void start() {
....
}
public static xxx getXXX() {
return xxx;
}
....
}
Run Code Online (Sandbox Code Playgroud)
问题是调用stop()是在一个匿名类内部扩展的Thread,因此它有自己的stop()方法继承自Thread:
new Thread() {
@Override
public void run() {
try {
MyService.this.stop(); <----- here
} catch (IOException | InterruptedException e) {
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
整个声明是MyService.this.stop();,这不仅仅是在这种情况下this.stop()与单独没有区别stop()。此符号 - MyService.this- 在封闭(嵌套)类内部使用,表示封闭实例,MyService在本例中为 的实例。请参阅 Java 语言规范15.8.4。合格了这个。
仅当封闭类具有与封闭类具有相同名称/签名的成员时才需要此表示法。在这种情况下,例如,如果该方法具有不同的名称,则根本stopService不需要限定或简单。this
注意:由于它无意更改类的功能,因此我建议不要扩展它,而是在其构造函数中Thread使用传递的参数:Runnable
new Thread(new Runnable() {
@Override
public void run() {
// the code
}
});
Run Code Online (Sandbox Code Playgroud)
这将避免必须使用合格的this(它仍然可以使用)。
它还可以避免对Thread成员的任何不必要的访问。