论坛首页 入门技术论坛

如何合理使用java中的静态成员

浏览 7448 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-03-29  
虽然常常使用java中的静态成员,但是却对在什么场合使用静态成员比较模糊,网络以及一些书面资料上大多讲解的是静态成员与实例成员之间的区别,但对如何合理有效的使用比较少讲。由经验不足,最近写代码又常常要用到(目前多只是用在共享资源上,但我想静态成员的价值应该不只这些),所以打算请教下大家,做个总结,以提高代码质量。
   发表时间:2007-03-29  
在我的使用中分为三种情况:

第一种情况 是在工具类中将“除了参数外不需要其它数据的”工具方法——比如格式化方法、数值计算方法等作为静态方法,在工具类中一般都可以做成这样;
这种方式即便于使用,又节省创建对象的开销

第二种情况 是对于含有静态数据成员和与该静态数据成员相关的操作,在这种情况下,静态数据和操作都是类相关的

第三种情况 现在使用机会较少,就是获取类的单一实例的Singleton应用中
0 请登录后投票
   发表时间:2007-03-29  
由于静态成员在多个实例中只维持一个,是否就是说在既可以使用实例成员又可以使用静态成员的情况下,优先考虑静态成员呢。比如我在使用log的时候就使用的是静态成员
0 请登录后投票
   发表时间:2007-03-29  
对于静态方法我也有一个疑问,在业务层的很多方法都是无状态的,既然这样是否定义静态类型效率高一些?
继续关注本帖的讨论...
0 请登录后投票
   发表时间:2007-03-29  
前一个项目我的所有的DAO的方法都是静态的,
所有的Utils类都是静态的,
很多常量都是静态的,
需要在整个应用程序级别共享通常都是静态的,比如我有一个类保存每一个用户的短消息内容,
可能是静态用的太多,
但是我觉得静态用起来很方便!
0 请登录后投票
   发表时间:2007-03-29  
以前有很多小项目的架构中很多的业务类中的方法都是静态的,这样就不用创建业务类的实例,然后还有dao中也搞静态的,呵呵,这个静态的功能确实挺好用的,比如还有序列化参数都是用静态的,这个可能比较常用,尤其在搞分布式的时候jvm版本不一样的情况下这个尤其重要
0 请登录后投票
   发表时间:2007-03-29  
没有同步问题就可以放心使用静态
0 请登录后投票
   发表时间:2007-03-30  
cozone_柯中 写道
没有同步问题就可以放心使用静态
我觉得使用静态或者单例模式主要考虑两个方面的问题就可以了。

第一个方面就是楼上说的同步问题。
第二个方面就是内存溢出问题,尤其使用静态声明或者单例模式含有Set,Collection,Map等集合类的属性,这个比较明显。

还有一种情况,就是静态属性是一个比较普通的Class,但是该Class中包含集合属性,则也要考虑是否有内存溢出问题,当然这种情况也要考虑同步问题。
0 请登录后投票
   发表时间:2007-03-30  
以上只是从是否会有问题的角度去考虑,并没有考虑设计结构上的问题,例如我前面的项目的DAO的方法都是静态的,我现在想替换DAO的实现,则很难做到,也就是说根本没有面向接口或者抽象编程。

为了面向接口编程,怎么办,于是可以随意替换具体实现的工厂模式产生了!

当工厂模式太过繁琐的时候,Ioc容器产生了。

在Ioc产生的今天,应该考虑将Utils类设置为静态的,共享配置设置为静态,我想不到还有什么地方用静态。

PS:纯属瞎猜
0 请登录后投票
   发表时间:2007-03-30  
jamesby 写道
以上只是从是否会有问题的角度去考虑,并没有考虑设计结构上的问题,例如我前面的项目的DAO的方法都是静态的,我现在想替换DAO的实现,则很难做到,也就是说根本没有面向接口或者抽象编程。

为了面向接口编程,怎么办,于是可以随意替换具体实现的工厂模式产生了!

当工厂模式太过繁琐的时候,Ioc容器产生了。

在Ioc产生的今天,应该考虑将Utils类设置为静态的,共享配置设置为静态,我想不到还有什么地方用静态。

PS:纯属瞎猜


我现在DAO的方法也是使用的静态。LS提醒了我,的确,若是在系统中夹杂了太多静态方法会使java所提倡的面向接口编程难以有效的执行。若采用自上而下的开发方式,而高层充斥着大量的静态方法、那整个系统结构就会在一定层度受到破坏,不是吗?若只是工具类和共享配置设置为静态(当然,或是是为了实现特定的设计模式),这样独立出来的静态成员集合或许会比较好
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics