论坛首页 Java企业应用论坛

项目中List的返回值

浏览 14172 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-14  
最近公司一个已经稳定运行了1年的web系统出现了性能问题,响应速度非常慢,系统是不断注册新的模块的,每次增加新模块都会带来一定负载,虽然很快就断定是由于大量模块的配置文件加载与初始数据缓存本身占用了大量内容,导致留给用户操作内存空间小造成,最好的办法就是卸载无用模块和清理缓存数据,但领导还是坚持要求检查代码并消除浪费内存的低效代码,系统比较大,这件事做起来可不容易,呵呵…
在检查的时候,发现方法中对无数据集合类型的返回有2种方式,Null和new List,系统是由很多人开发的,根据代码上看很明显没有对这些细节形成统一的规范,不过也能理解…
随便找人问了问,然后告诉他们以后规范方面尽量统一,至于上面的问题返回null还是创建一个空内容数组,由于系统刚出现内存问题,几乎统一了意见,用null吧…
真是这样吗?创建新对象返回时为了避免客户端代码的空值验证,返回null值是为了减少开销,视乎都有道理。其实个人觉得不应该返回空,当然,这里暂时不考虑业务需要的情况。但内存开销怎么办?无数据集合基本上是不变的,开销应该是很低的,不过还是有两全其美的办法,不知道大家对Collections工具类的empty系列静态方法用的多不多,这些方法返回一个无内容集合,并且都是基于同一个对象实例,这样,就可以避免null值的验证和那一点开销了,建议大家大量使用


举例:
public List returnArray2(Object data){
	if(data == null){
		return Collections.emptyList();
	}
	return (List) data;
}


当然还有Collections.emptyMap()、Collections.emptySet(),原理是一样的
另外,也可以选择Collections的静态变量进行返回,其实上述方法中返回的就是下面的Collections中定义的静态变量:
public static final List EMPTY_LIST = new EmptyList();
public static final Set EMPTY_SET = new EmptySet();
public static final Map EMPTY_MAP = new EmptyMap();

在jdk1.5之前的版本使用只能使用静态变量的方式访问,具体可以见jdk源码

   发表时间:2010-01-15  
EmptyList的size是几?
0 请登录后投票
   发表时间:2010-01-15   最后修改:2010-01-15
New对象从来不是问题,问题在于new了没释放,你这里查找内存问题跟返回什么没有关系。

当然,返回null是很差的实践,返回 Collections中的那些预定义空集合是更好的方式,其实就是Null Object模式。
0 请登录后投票
   发表时间:2010-01-15  
Collections学习了。。。。
0 请登录后投票
   发表时间:2010-01-15  
处理方法不妥啊
感觉你还没找到问题根源
只是一个多返回new的操作怕是不会导致系统不堪重负把
看看dump把,先找到根源
0 请登录后投票
   发表时间:2010-01-15  
viei 写道
处理方法不妥啊
感觉你还没找到问题根源
只是一个多返回new的操作怕是不会导致系统不堪重负把
看看dump把,先找到根源


是的,其实是由是由于在解决性能问题的时候偶尔发现了这个问题,所以想和大家交流交流,性能问题是因为有些模块出现严重的内存占用过多,然后启动后做了大量缓存并读取大量配置文件,导致初始内存占用过高引起的
0 请登录后投票
   发表时间:2010-01-15  
Item 43: Return empty arrays or collections, not nulls

public List<Cheese> getCheeseList() {
  if (cheesesInStock.isEmpty())
    return Collections.emptyList(); // Always returns same list
  else
    return new ArrayList<Cheese>(cheesesInStock);
}


from Effective Java : Joshua Bloch
1 请登录后投票
   发表时间:2010-01-16  
为什么返回null不好呢?
0 请登录后投票
   发表时间:2010-01-16   最后修改:2010-01-16
return null 有造成null pointer exception的可能吧...
所以取之前要判断是否为null
0 请登录后投票
   发表时间:2010-01-16  
返回一个NULL 没有什么问题。
程序逻辑判断不要出现NULL异常就行。
这不是程序性能的关键点啊/
0 请登录后投票
论坛首页 Java企业应用版

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