Java“this”用法

use*_*298 1 java

我是 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)

use*_*675 7

问题是调用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成员的任何不必要的访问。