论坛首页 Java企业应用论坛

项目中List的返回值

浏览 14169 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-18   最后修改:2010-01-18
凤舞凰扬 写道
引用
empty实现只占用一份内存,而且基本对象的内存占用我认为是很低的,而且如果没意外很快也就回收了。

   这句真没看懂....

可能他的意思是说:
        List list1 = Collections.emptyList();
        List list2 = Collections.emptyList();
        System.out.println(list1 == list2);//true
0 请登录后投票
   发表时间:2010-01-18  
凤舞凰扬 写道
nickevin 写道
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. 对于服务层或者提供服务的类(比如工具类)等,使用默认的empty实现(不仅仅是List,还包括Set, Map等数据结构类)是正确的选择。这样可以避免客户程序调用时对返回值的理解不一致从而出现的NullPointerException。
2. 对于数据实体类,用于ORM映射时(比如domain层),就要小心了,不要随便返回empty实现。尤其是使用了LazyLoading技术来进行一对多mapping时。因为默认的empty实现都是不可写的。这个时候,如果ORM试图延迟装载对应的实体类时(访问主实体时,子实体集合是空的;而第一次访问子实体集合时,ORM会去装载子实体,并填充集合),就会出现异常。
   所以大家对于书的理解,对于程序的理解,切记要在一定范围内。


学习了,在以后的开发中会注意,javaeye 里大牛不少
0 请登录后投票
   发表时间:2010-01-19  
内存紧缩的问题是不是出在过多人的登录上?过多的HTTPSESSION似乎很占用服务器内存。
0 请登录后投票
   发表时间:2010-01-20  
hkliya 写道
凤舞凰扬 写道
引用
empty实现只占用一份内存,而且基本对象的内存占用我认为是很低的,而且如果没意外很快也就回收了。

   这句真没看懂....

可能他的意思是说:
        List list1 = Collections.emptyList();
        List list2 = Collections.emptyList();
        System.out.println(list1 == list2);//true

不好意思,很久没关注了,
谢谢哥哥替我解释。

0 请登录后投票
   发表时间:2010-01-20  
另外就是new对象,我个人看法,直接new个list返回回去,也耗费不了什么资源,当然没有empty实现好
0 请登录后投票
   发表时间:2010-01-21   最后修改:2010-01-21
凤舞凰扬 写道
nickevin 写道
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. 对于服务层或者提供服务的类(比如工具类)等,使用默认的empty实现(不仅仅是List,还包括Set, Map等数据结构类)是正确的选择。这样可以避免客户程序调用时对返回值的理解不一致从而出现的NullPointerException。
2. 对于数据实体类,用于ORM映射时(比如domain层),就要小心了,不要随便返回empty实现。尤其是使用了LazyLoading技术来进行一对多mapping时。因为默认的empty实现都是不可写的。这个时候,如果ORM试图延迟装载对应的实体类时(访问主实体时,子实体集合是空的;而第一次访问子实体集合时,ORM会去装载子实体,并填充集合),就会出现异常。
   所以大家对于书的理解,对于程序的理解,切记要在一定范围内。

没试过,不知道说的填充异常,具体是如何产生的。
0 请登录后投票
   发表时间:2010-01-21  
sunsong 写道
凤舞凰扬 写道
nickevin 写道
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. 对于服务层或者提供服务的类(比如工具类)等,使用默认的empty实现(不仅仅是List,还包括Set, Map等数据结构类)是正确的选择。这样可以避免客户程序调用时对返回值的理解不一致从而出现的NullPointerException。
2. 对于数据实体类,用于ORM映射时(比如domain层),就要小心了,不要随便返回empty实现。尤其是使用了LazyLoading技术来进行一对多mapping时。因为默认的empty实现都是不可写的。这个时候,如果ORM试图延迟装载对应的实体类时(访问主实体时,子实体集合是空的;而第一次访问子实体集合时,ORM会去装载子实体,并填充集合),就会出现异常。
   所以大家对于书的理解,对于程序的理解,切记要在一定范围内。

没试过,不知道说的填充异常,具体是如何产生的。

List list1 = Collections.emptyList();  
list1.add("a");

抛异常。。。。就这样。
0 请登录后投票
   发表时间:2010-01-21  
谢谢LZ,学到了。原来返回null也会在占用一定空间啊·~~~看来影响程序性能的瓶颈还真多啊~~
0 请登录后投票
   发表时间:2010-01-22  
anky_end 写道
sunsong 写道
凤舞凰扬 写道
nickevin 写道
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. 对于服务层或者提供服务的类(比如工具类)等,使用默认的empty实现(不仅仅是List,还包括Set, Map等数据结构类)是正确的选择。这样可以避免客户程序调用时对返回值的理解不一致从而出现的NullPointerException。
2. 对于数据实体类,用于ORM映射时(比如domain层),就要小心了,不要随便返回empty实现。尤其是使用了LazyLoading技术来进行一对多mapping时。因为默认的empty实现都是不可写的。这个时候,如果ORM试图延迟装载对应的实体类时(访问主实体时,子实体集合是空的;而第一次访问子实体集合时,ORM会去装载子实体,并填充集合),就会出现异常。
   所以大家对于书的理解,对于程序的理解,切记要在一定范围内。

没试过,不知道说的填充异常,具体是如何产生的。

List list1 = Collections.emptyList();  
list1.add("a");

抛异常。。。。就这样。

ORM延迟加载会有这样的情况吗?如果主实体是一个emptyList,怎么会加载子实体呢?
0 请登录后投票
   发表时间:2010-01-22  
fengsage 写道
谢谢LZ,学到了。原来返回null也会在占用一定空间啊·~~~看来影响程序性能的瓶颈还真多啊~~

我觉得楼主说的已经很明白
楼主并不认为new List会占用多少内存,出问题的是其他原因。

我还是坚持这个观点,即使直接返回个new List也不会有什么问题。这种短期对象很快就被回收了。

会出问题的是长期驻留在内存的东东,比如楼主说的配置模块缓存
0 请登录后投票
论坛首页 Java企业应用版

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