当前位置:  开发笔记 > 编程语言 > 正文

为什么从非静态方法访问静态方法不好?

如何解决《为什么从非静态方法访问静态方法不好?》经验,为你挑选了2个好方法。

Netbeans告诉我从非静态方法访问静态方法是不好的.为什么这么糟糕?"访问静态方法getInstance"是警告:

import java.util.Calendar;

public class Clock
{
    // Instance fields
    private Calendar time;

    /**
     * Constructor. Starts the clock at the current operating system time
     */
    public Clock()
    {
        System.out.println(getSystemTime());
    }

    private String getSystemTime()
    {
        return this.time.getInstance().get(Calendar.HOUR)+":"+
                this.time.getInstance().get(Calendar.MINUTE);
   }

}



1> orip..:

您可能正在从实例而不是直接访问静态方法.请尝试使用Calendar.getInstance():

private String getSystemTime()
{
    return Calendar.getInstance().get(Calendar.HOUR)+":"+
           Calendar.getInstance().get(Calendar.MINUTE);
}



2> Jon Skeet..:

"返回静态方法"是什么意思?可以在我的视图中从实例方法调用静态方法 - 当然,这取决于具体情况.你能发一些Netbeans抱怨的代码吗?

想象的一件事是,如果你只使用实例方法中的静态方法,而不使用实例的任何数据.有时这是实现接口或从基类覆盖方法所需要的,但是如果你没有覆盖任何东西并且你没有使用任何实例变量,那么让方法静态以表明它确实不是很好取决于特定的实例.

编辑:通过编辑的问题,这很有道理.IMO是Java的一个缺陷,它首先允许它.它可能会产生非常误导性的代码.我最喜欢的例子(这意味着老人可能已经看到我之前发布它:)是Thread.sleep.这段代码看起来像什么?

Thread t = new Thread(someRunnable);
t.start();
t.sleep(1000);

在我看来,看起来新线程被要求睡觉 - 类似于呼叫suspend.但是没有 - 你只能要求当前正在执行的线程休眠,这就是Thread.sleep静态方法的原因.上面的代码是合法的Java,并且会使当前正在执行的线程在新创建的线程(可能)运行时暂停一段时间......根本不是代码看起来像乍看之下.

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有