static能大量用么?

03-11-06 chenfz
今天碰到一个问题:static能大量用么?无论是修饰变量,还是修饰方法(method)。

在我看来,static不能用来大量修饰方法,因为我觉得static用多的话,占用内存多。但是有人有另外一个意见:static能提高速度,对内存无影响。

不知道大家如何看这个问题?

无道
2003-11-06 22:15
该用时才用,而不是为使用而用.

chenfz
2003-11-07 08:51
什么时候改用?

我碰到一个人的代码,他将类中大量的方法定义为static。我问他为什么,他说这样速度快,好。

我想知道大量用static,将来运行的时候是不是很耗内存。

java_lover
2003-11-07 12:35
会影响内存的。不要什么都用STATIC来定义

weihello
2003-11-07 15:39
确实是系统固有的行为和对象,用之。重要的是要考虑清楚,是否是固有的。

大部分时候,我们不用讨论static是否影响效率,而应该是这确实客观反映了系统的本来面貌否。

banq
2003-11-07 17:36
static使用需要和多线程概念联系起来,过分使用Static会导致系统单线程运行,整个系统性能大幅度降低,使得你都无法定位性能问题。

我曾经碰到过一个游戏系统,由于大量使用static 和singleton,导致单线程,速度太慢了。注意:对于一些初学者,单线程开发是最方便的,这也是没有架构设计原因导致的,这样的项目必然失败。

Horser
2003-11-07 20:17
static的作用和上边几位说的有什么联系吗?大家还是好好看一看java语法吧,用错位置的话程序逻辑上都不会正常跑起来的!

robbin
2003-11-07 23:57
static方法的问题我前面有帖子详细讨论过,搜索一下。

static方法本身不会影响性能,笼统的来说,由于不需要new对象,也不需要隐式传递对象引用,因此内存消耗少,执行速度快。

但是由于static方法调用本身是不访问对象的,因此方法内部不能够使用非静态的属性,如果你不管三七二十一乱用static方法,必然会造成定义大量的静态属性,这样反而会造成内存消耗大,对象之间偶合性非常高的问题。

因此是否采用static方法不取决于内存消耗和执行效率,而是取决于你的业务逻辑。笼统的来说,如果对象是有状态的,那么需要new一个对象,方法不是静态的,如果对象是无状态的,那么使用静态方法,把类的静态方法当做函数调用来使用。

水雨澍
2003-11-08 00:56
如果你的项目用了大量的STATIC,那么你的设计思路一定有问题!

agilejava
2003-11-08 14:15
我看到ofbiz就使用了大量的static方法啊

missxkl
2003-11-10 09:14
banq能否解释一下为什么static方法用多了会产生单线程执行的问题?

如果不用static方法,频繁创建对象、频繁回收的成本如何计算?

我们的项目中现在就遇到了这样的一个问题。非同步的静态方法

也会导致单线程么?

sim114
2003-11-10 17:57
/*

static方法本身不会影响性能,笼统的来说,由于不需要new对象,也不需要隐式传递对象引用,因此内存消耗少,执行速度快。

如果你的项目用了大量的STATIC,那么你的设计思路一定有问题!

*/

一般来说是这样子的(除非你的设计差到不行)。从面向对象的观点说,根本就不应该有static method,他的存在就是为了快速函数调用

static 会导致单线程??,不是吧??

sim114
2003-11-10 18:02
singleton,导致单线程??

synchronized method??

singleton 主要是把业务逻辑分发出去,有点类似action,不应该造成单线程阿

zzeric
2003-11-10 20:12
在静态方法内部只要没有用到静态成员变量的话,就不会有多线程的问题,同理singleton也是如此,banq说的情况估计是设计失误。static方法一般用于设计一些通用的Helper类,以节约内存,提高速度,不适宜放在有业务意义的类里面,因为会让人觉得跟面向对象的原理有所违背,但如果为了方便不想用Helper类而直接写在业务类里也是无可厚非的。

raynix
2003-11-11 10:15

> singleton

> 主要是把业务逻辑分发出去,有点类似action,不应该造成单

> 叱贪?>

分发业务逻辑???

请参考singleton的定义:

public class Sn {
    private static Sn ourInstance;

    public synchronized static Sn getInstance() {
        if (ourInstance == null) {
            ourInstance = new Sn();
        }
        return ourInstance;
    }

    private Sn() {
    }
}
<p>

猜你喜欢
3Go 1 2 3 下一页