private void getSectionList(final List<KeywordMstDto> keywordList, final KeywordMstDto keyMstDto) {
List<SectionDto> sectionList = new ArrayList<SectionDto>();
SectionDto sectionDto = null;
String sectionId = "";
for (KeywordMstDto keywordMst : keywordList) {
if (!sectionId.equals(keywordMst.getBumonCd())) {
sectionDto = new SectionDto();
sectionDto.setSectionId(keywordMst.getBumonCd());
sectionDto.setSectionName(keywordMst.getSectionName());
sectionList.add(sectionDto);
());
sectionId = sectionDto.getSectionId();
}
}
keyMstDto.setSectionList(sectionList);
}
看这段Java代码,我把new dto写在了循环里才实现功能,但是不推荐这种方法,请问该怎么写,写在循环外,每一次的对象都是一个,因此不行 ,请问大神们孩有什么办法,这段代码该怎么写,!急
|
10分 |
这有什么问题?为什么不推荐?
我觉得你直接把
SectionDto sectionDto = new SectionDto();
全放循环里也没问题啊
|
30分 |
写在循环外,每一次的对象都是一个 每次的对象都是不同的对象
SectionDto sectionDto = null; 只是创建了一个对象变量
sectionDto = new SectionDto(); 在循环内,每次指向不同的引用,所以是不同的对象
楼主试一下下面的示例,每次都是不同的字符串
List<String> li = new ArrayList<String>();
String str = null;
for (int i =0; i<10; i++) {
str = new String("str" + i);
li.add(str);
}
System.out.println(li.size());
for (String strt : li) {
System.out.println(strt);
}
|
20分 |
写在循环内是担心资源和效率问题吗?如果是并且SectionDto里面成员多或者循环次数很多的话,那么将SectionDto在循环外实例化,然后实现序列化,在循环内直接复制已实例化的SectionDto实例,这样这样会节省很多资源也会快很多;如果SectionDto里面成员不多或者你循环的次数不多的话放在循环里面和外面没什么区别
|
|
没什么替代方案,只能这么写。 而且你也不用担心任何的效率问题
|
|
这么写没什么问题吧,我是想不出更好的方法了!
|
|
SectionDto sectionDto = new SectionDto();
...
if (!sectionId.equals(keywordMst.getBumonCd())) {
SectionDto b2 = (SectionDto)sectionDto.clone();
clone是native实现,比new速度快。
|
|
好像是担心资源问题,请问怎么实现序列化,这个不是很懂,代码该怎么实现呢?求助啊!
|
|
这个是克隆吗?不是很懂,说明一下呗!十分感谢
|
|
是克隆。 克隆的实现是native的,不是java来实现的,理论上会快很多。
|
|
SectionDto sectionDto = new SectionDto();
...
if (!sectionId.equals(keywordMst.getBumonCd())) {
SectionDto b2 = (SectionDto)sectionDto.clone();
clone是native实现,比new速度快。
这个是克隆吗?不是很懂,说明一下呗!十分感谢
但是克隆该如何应用呢,我现在思维已经定式了,想不到该如何做,用克隆的方法该如何实现我上边的代码,你上边写的代码好像不对吧!看不懂啊!求帮助啊!
|
|
SectionDto sectionDto = new SectionDto();
...
if (!sectionId.equals(keywordMst.getBumonCd())) {
SectionDto b2 = (SectionDto)sectionDto.clone();
clone是native实现,比new速度快。
瞎搞! 加个clone,SectionDto类的功能变了不说, 把clone的功能也扭曲了,很显然它不是用来做对象创建的吧, 你这样写代码让别人怎么看? 如果创建一个对象耗性能那是你这个类设计有问题!
|
|
SectionDto sectionDto = new SectionDto();
...
if (!sectionId.equals(keywordMst.getBumonCd())) {
SectionDto b2 = (SectionDto)sectionDto.clone();
clone是native实现,比new速度快。
这个是克隆吗?不是很懂,说明一下呗!十分感谢
但是克隆该如何应用呢,我现在思维已经定式了,想不到该如何做,用克隆的方法该如何实现我上边的代码,你上边写的代码好像不对吧!看不懂啊!求帮助啊!
调用clone必需要实现Cloneable接口, 否则会报错
|
|
SectionDto sectionDto = new SectionDto();
...
if (!sectionId.equals(keywordMst.getBumonCd())) {
SectionDto b2 = (SectionDto)sectionDto.clone();
clone是native实现,比new速度快。
瞎搞! 加个clone,SectionDto类的功能变了不说, 把clone的功能也扭曲了,很显然它不是用来做对象创建的吧, 你这样写代码让别人怎么看? 如果创建一个对象耗性能那是你这个类设计有问题!
建议去学习下原型模式,clone用在这里是可以的,都是委托创建对象的方式,另外SectionDto类只看出是做存储用,不涉及功能改变。
另外您理解的clone用在何处呢?
|
|
二楼正解,自如果、、你循环那么多次,最后放进去的只是一个对象,最后一个循环对象;
|
|
SectionDto sectionDto = new SectionDto();
...
if (!sectionId.equals(keywordMst.getBumonCd())) {
SectionDto b2 = (SectionDto)sectionDto.clone();
clone是native实现,比new速度快。
瞎搞! 加个clone,SectionDto类的功能变了不说, 把clone的功能也扭曲了,很显然它不是用来做对象创建的吧, 你这样写代码让别人怎么看? 如果创建一个对象耗性能那是你这个类设计有问题!
建议去学习下原型模式,clone用在这里是可以的,都是委托创建对象的方式,另外SectionDto类只看出是做存储用,不涉及功能改变。
另外您理解的clone用在何处呢?
简单对象的属性复制呀, 楼主这里完全不存在复制的意思。 单纯用作创建对象,我不知道它能比new能快多少。 关键我不赞同你这解决问题的方法, 本来就是一个简单的逻辑,你要100W个对象就创建100W个对象呀。
|
|
直接创建对象就ok
|
|
SectionDto sectionDto = new SectionDto();
...
if (!sectionId.equals(keywordMst.getBumonCd())) {
SectionDto b2 = (SectionDto)sectionDto.clone();
clone是native实现,比new速度快。
瞎搞! 加个clone,SectionDto类的功能变了不说, 把clone的功能也扭曲了,很显然它不是用来做对象创建的吧, 你这样写代码让别人怎么看? 如果创建一个对象耗性能那是你这个类设计有问题!
建议去学习下原型模式,clone用在这里是可以的,都是委托创建对象的方式,另外SectionDto类只看出是做存储用,不涉及功能改变。
另外您理解的clone用在何处呢?
简单对象的属性复制呀, 楼主这里完全不存在复制的意思。 单纯用作创建对象,我不知道它能比new能快多少。 关键我不赞同你这解决问题的方法, 本来就是一个简单的逻辑,你要100W个对象就创建100W个对象呀。
为什么您不能理解clone也是一种创建对象的方式?
|
|
SectionDto sectionDto = new SectionDto();
...
if (!sectionId.equals(keywordMst.getBumonCd())) {
SectionDto b2 = (SectionDto)sectionDto.clone();
clone是native实现,比new速度快。
瞎搞! 加个clone,SectionDto类的功能变了不说, 把clone的功能也扭曲了,很显然它不是用来做对象创建的吧, 你这样写代码让别人怎么看? 如果创建一个对象耗性能那是你这个类设计有问题!
建议去学习下原型模式,clone用在这里是可以的,都是委托创建对象的方式,另外SectionDto类只看出是做存储用,不涉及功能改变。
另外您理解的clone用在何处呢?
简单对象的属性复制呀, 楼主这里完全不存在复制的意思。 单纯用作创建对象,我不知道它能比new能快多少。 关键我不赞同你这解决问题的方法, 本来就是一个简单的逻辑,你要100W个对象就创建100W个对象呀。
为什么您不能理解clone也是一种创建对象的方式?
从应用意图上讲,需要一个干净的对象实例,而不是已经含有某些值的对象,所以说应该用创建,而不是复制
|
|
使用原型设计模式
|
|
SectionDto sectionDto = new SectionDto();
...
if (!sectionId.equals(keywordMst.getBumonCd())) {
SectionDto b2 = (SectionDto)sectionDto.clone();
clone是native实现,比new速度快。
瞎搞! 加个clone,SectionDto类的功能变了不说, 把clone的功能也扭曲了,很显然它不是用来做对象创建的吧, 你这样写代码让别人怎么看? 如果创建一个对象耗性能那是你这个类设计有问题!
建议去学习下原型模式,clone用在这里是可以的,都是委托创建对象的方式,另外SectionDto类只看出是做存储用,不涉及功能改变。
另外您理解的clone用在何处呢?
简单对象的属性复制呀, 楼主这里完全不存在复制的意思。 单纯用作创建对象,我不知道它能比new能快多少。 关键我不赞同你这解决问题的方法, 本来就是一个简单的逻辑,你要100W个对象就创建100W个对象呀。
为什么您不能理解clone也是一种创建对象的方式?
从应用意图上讲,需要一个干净的对象实例,而不是已经含有某些值的对象,所以说应该用创建,而不是复制
每次复制的都是空对象,哪里有值?
|
|
简单的问题就不要复杂化了.
原型的用处就是用来创建有属性的对像,对于初始化复杂的对像,比直接创建要快.
对简单对像来说,没啥意思
|
|
SectionDto sectionDto = new SectionDto();
...
if (!sectionId.equals(keywordMst.getBumonCd())) {
SectionDto b2 = (SectionDto)sectionDto.clone();
clone是native实现,比new速度快。
瞎搞! 加个clone,SectionDto类的功能变了不说, 把clone的功能也扭曲了,很显然它不是用来做对象创建的吧, 你这样写代码让别人怎么看? 如果创建一个对象耗性能那是你这个类设计有问题!
建议去学习下原型模式,clone用在这里是可以的,都是委托创建对象的方式,另外SectionDto类只看出是做存储用,不涉及功能改变。
另外您理解的clone用在何处呢?
简单对象的属性复制呀, 楼主这里完全不存在复制的意思。 单纯用作创建对象,我不知道它能比new能快多少。 关键我不赞同你这解决问题的方法, 本来就是一个简单的逻辑,你要100W个对象就创建100W个对象呀。
为什么您不能理解clone也是一种创建对象的方式?
“小孩才分对错,大人值看利弊”。
一,不是所有的对象都可以克隆,没有必要为了创建对象去修改,
二,现在都是团队工作,很多时候我们遵守的是习惯而不是规则,这种创建方式会对别人造成疑惑。
另外,也可以去实际测试一下clone创建对象到底能带来多少好处,毕竟看利弊而定
|
|
SectionDto sectionDto = new SectionDto();
...
if (!sectionId.equals(keywordMst.getBumonCd())) {
SectionDto b2 = (SectionDto)sectionDto.clone();
clone是native实现,比new速度快。
瞎搞! 加个clone,SectionDto类的功能变了不说, 把clone的功能也扭曲了,很显然它不是用来做对象创建的吧, 你这样写代码让别人怎么看? 如果创建一个对象耗性能那是你这个类设计有问题!
建议去学习下原型模式,clone用在这里是可以的,都是委托创建对象的方式,另外SectionDto类只看出是做存储用,不涉及功能改变。
另外您理解的clone用在何处呢?
简单对象的属性复制呀, 楼主这里完全不存在复制的意思。 单纯用作创建对象,我不知道它能比new能快多少。 关键我不赞同你这解决问题的方法, 本来就是一个简单的逻辑,你要100W个对象就创建100W个对象呀。
为什么您不能理解clone也是一种创建对象的方式?
“小孩才分对错,大人值看利弊”。
一,不是所有的对象都可以克隆,没有必要为了创建对象去修改,
二,现在都是团队工作,很多时候我们遵守的是习惯而不是规则,这种创建方式会对别人造成疑惑。
另外,也可以去实际测试一下clone创建对象到底能带来多少好处,毕竟看利弊而定
对错??
1.这是一个替代方法
2.clone不会对团队造成疑惑,也可能你会疑惑,我的团队肯定不会
clone创建空对象绝对比new要慢,但这不能阻挡这是一个创建对象的方式呀
看楼主标题来说好吗,这不是替代方法?
|
|
如果入参keywordList其它地方没用,可以考虑对keywordList进行过滤操作:将不符合条件的从keywordList去掉,最后只要传递keywordList即可。
当然,循环里new的对象很小,只有两个字段有值,没啥损耗的。如果代码性能有问题,建议去别处走读下代码,这里循环内new,是希拉平常的事情。
|
|
哈哈
想看看你们如何说服我
多用用不常用的东西对新手有好处
|
|
看了几遍这个方法,总觉得很奇怪.
看看方法的参数final List<KeywordMstDto> keywordList, final KeywordMstDto keyMstDto.你将一群dto过滤之后放入另一个的dto,并且dto还是同一个类,我表示没理解这么做.如果只是过滤那你完全可以不new任务一个对象,只需要将原有的一群dto过滤掉一些即可
|
|
楼主不要杞人忧天了,这样写没有什么问题
|
|
真佩服你们的 专研精神,在for循环里面new一个实例没问题,因为理论上就需要这样做,List中需要放入不同的实例,而实例只有实例化出来的才会从根本上不同,而这正是List需要的
|
|
为什么要把对象放进去循环呢
|
|
private?void?getSectionList(final?List<KeywordMstDto>?keywordList,?final?KeywordMstDto?keyMstDto)?{
?
????????List<SectionDto>?sectionList?=?new?ArrayList<SectionDto>();
? SectionDto??sectionDto?=?new?SectionDto();
????????SectionDto?sectionDto?=??null;
????????String?sectionId?=?””;
string keywordMst=” “;
String sectionDto=” “;
????????for?(KeywordMstDto?keywordMst?:?keywordList)?{
????????????if?(!sectionId.equals(keywordMst.getBumonCd()))?{
keywordMst=keywordMst.getSectionName();
sectionDto=keywordMst.getBumonCd();
????????????????}
sectionDto.setSectionId(keywordMst);
????????????????sectionDto.setSectionName(sectionDto);
????????????????sectionList.add(sectionDto);
????????????}
??sectionId?=?sectionDto.getSectionId();
????????}
????????keyMstDto.setSectionList(sectionList);
????}
|