`
jarod2008
  • 浏览: 80585 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

有关静态方法的一些"谬论"

    博客分类:
  • java
阅读更多

【转自】http://www.rainsts.net/article.asp?id=261

 

在论坛上经常看到一些莫名其妙的论点,其中有关静态方法的就很多。

1. 静态方法效率比实例方法高……
2. 静态方法比实例方法占内存,只有当类型被释放时才被回收……
3. 多个线程同时调用静态方法时,返回结果可能不准确……

……

说 实话,我很奇怪为什么会有这样的观点。首先,无论是静态方法还是实例方法都是通过类型方法表来查找,然后再去执行的,每次调用都会创建新的临时堆栈,只要 调用代码相同,怎么可能有效率高低之分?如第1种说法,可能是将对象实例化的时间也算进去了。而第2种说法,如果将静态方法换成静态字段就正确了。无论是 静态方法还是实例方法,当调用结束后,其内部临时变量都会失去引用,自然会被GC在合适的时间回收。如果要等类型释放才被回收,那麻烦就大了,因为类型只 有在应用程序域被卸载或者程序关闭时才会被"释放",如此下去,程序还能不出问题?至于第3种说法,我们用一个小例子验证一下。

public class Program
{
  static void Test()
  {
    Console.WriteLine(Thread.CurrentThread.Name + " start...");
    Thread.Sleep(10000);
    Console.WriteLine(Thread.CurrentThread.Name + " end...");
  }

  static void Main(string[] args)
  {
    Thread t1 = new Thread(delegate() { Test(); });
    Thread t2 = new Thread(delegate() { Test(); });

    t1.Name = "t1";
    t2.Name = "t2";

    t1.Start();
    t2.Start();
  }
}


输出:
t1 start...
t2 start...
t1 end...
t2 end...

通过这个例子,我们要明白,每个线程在执行静态方法的时候会创建独立的执行环境,内存中会有多个静态方法"实例"在同时执行。因此只要方法中不涉及共享数据,是不会出现结果出问题这么一说的。

很多初学者,习惯于将所有的方法都写成静态方法,理由是调用简单,想来是对OO思想了解不透的缘故。一般情况下,我们可以遵循以下几个简单的原则。

1. 当方法不需要保存状态,不需要调用外界变量(非方法参数)时,适合用静态方法。
2. 当类型中的方法是一些"互不相干"的帮助型(Helper)方法时,适合使用 static class / static method。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics