锁定老帖子 主题:项目中List的返回值
精华帖 (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 |
|
返回顶楼 | |
发表时间: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 里大牛不少 |
|
返回顶楼 | |
发表时间:2010-01-19
内存紧缩的问题是不是出在过多人的登录上?过多的HTTPSESSION似乎很占用服务器内存。
|
|
返回顶楼 | |
发表时间:2010-01-20
hkliya 写道 凤舞凰扬 写道 引用 empty实现只占用一份内存,而且基本对象的内存占用我认为是很低的,而且如果没意外很快也就回收了。
这句真没看懂.... 可能他的意思是说: List list1 = Collections.emptyList(); List list2 = Collections.emptyList(); System.out.println(list1 == list2);//true 不好意思,很久没关注了, 谢谢哥哥替我解释。 |
|
返回顶楼 | |
发表时间:2010-01-20
另外就是new对象,我个人看法,直接new个list返回回去,也耗费不了什么资源,当然没有empty实现好
|
|
返回顶楼 | |
发表时间: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会去装载子实体,并填充集合),就会出现异常。 所以大家对于书的理解,对于程序的理解,切记要在一定范围内。 没试过,不知道说的填充异常,具体是如何产生的。 |
|
返回顶楼 | |
发表时间: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"); 抛异常。。。。就这样。 |
|
返回顶楼 | |
发表时间:2010-01-21
谢谢LZ,学到了。原来返回null也会在占用一定空间啊·~~~看来影响程序性能的瓶颈还真多啊~~
|
|
返回顶楼 | |
发表时间: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,怎么会加载子实体呢? |
|
返回顶楼 | |
发表时间:2010-01-22
fengsage 写道 谢谢LZ,学到了。原来返回null也会在占用一定空间啊·~~~看来影响程序性能的瓶颈还真多啊~~
我觉得楼主说的已经很明白 楼主并不认为new List会占用多少内存,出问题的是其他原因。 我还是坚持这个观点,即使直接返回个new List也不会有什么问题。这种短期对象很快就被回收了。 会出问题的是长期驻留在内存的东东,比如楼主说的配置模块缓存 |
|
返回顶楼 | |