Java示例:这真的是以非静态方式访问静态方法吗?



我只是在研究教科书中的一些示例,在Eclipse中编写代码来弄清楚它。

这是我有疑问的方法的代码:

public void run() {
    //Get the lock before entering the loop
    synchronized(getClass()) {
        for (int i =0; i<N; i++) {
            System.out.println(getName() + " is tired");
            
            try{
                Thread.currentThread().sleep(DELAY);
            } catch (InterruptedException e) {}
            
            System.out.println(getName() + " is rested");
        }

在线上线:

Thread.currentThread().sleep(DELAY)

Eclipse 给出了一个警告:"应该以静态方式访问 Thread 类型的静态方法 sleep(long)。Eclipse 建议采用以下解决方案:

Thread.currentThread();
Thread.sleep(DELAY);

我不明白为什么它会有所作为(如果真的如此)。有人可以解释一下吗?

sleep() 是一个

静态方法,它会导致当前线程休眠指定的时间量。因此,currentThread()调用是多余的,并且可能会造成混淆,因为它几乎意味着您可以使用类似的代码使另一个线程休眠(您不能)。

编写该代码的最佳方法很简单:

Thread.sleep(DELAY);

有问题的代码与线程无关。Eclipse 只是说你应该直接通过类名访问静态方法sleep,而不是通过 instanse:Thread.sleep(DELAY)

为了

清楚起见(和简洁),应C.f()访问类 C 的任何静态static ... f()方法。

Thread.sleep() 已经是一个静态方法,会影响当前线程。没有必要调用 currentThread()。

Thread.delay 是一个静态方法。 它不需要实例来调用它 - 你可以说 Thread.delay()。

Thread.currentThread() 返回对当前线程的引用。 您可以在其上调用静态方法,但您并不严格需要引用,并且根本不使用它。 您同样可以这样做:

new Thread().delay(100);

。它仍然会使当前线程进入睡眠状态 - 而不是我们刚刚创建的线程。

所以 eclipse 告诉你,更好、更少混淆的方式是 Thread.delay(100)。

如果我

错了,请纠正我,但警告可能是"静态方法......应该以静态方式访问"(不是...应以非静态方式访问)。

事实上,打电话是令人困惑的

someThread.sleep(1000)

因为 Thread.sleep() 是一个静态方法,在 不被称为 "反对" someThread,而是在当前线程上。

因此,消息显示"以静态方式访问静态方法":)

它在执行上没有任何区别。然而,第二个选项 Thread.sleep() 更具可读性,因为用户不会混淆它是一个实例方法。

> 通过访问该方法Thread.currentThread().sleep()它给人的印象是它是一个实例方法,为了避免混淆,Eclipse 建议您通过所有者类访问静态方法,从而表明它们实际上是静态的。

正如 Victor Sorokin所写的那样,警告与线程的示例代码无关。 这是另一个示例,在 Eclipse 中,我们得到相同的编译器警告:

OptionBuilder.withArgName(PROPERTY_ARG).hasArg(true).isRequired(false).create(PROPERTY_ARG_OPTION);

这是使用 Apache Commons CLI 库。 OptionBuilder使用"流畅"的构建器模式。 我看到修复警告的唯一方法是使用推荐的 Eclipse 提示,该提示将行分成多个语句,或者在前面附加注释以忽略警告。

Thread currentThread = Thread.currentThread();
currentThread.wait(DELAY); 

相关内容

最新更新