兼顾代码整洁性与应用性能,两种循环实现方案如何选择?
应该选择哪种循环实现?
毫无疑问,你应该选择第二种方案,具体原因如下:
1. 可读性与可维护性是首要考虑因素
第二种方案通过引入临时变量poolDefinition,彻底避免了重复调用poolList.getPoolList().get(i)的冗余代码,逻辑一目了然。任何人读这段代码时,都能快速理解我们在操作同一个PoolDefinition对象;后续如果需要修改对这个对象的操作(比如新增属性调用),只需要改一处即可,而第一种方案要重复修改多次,不仅繁琐还容易出现遗漏或错误。
2. 少量临时对象的性能影响完全可以忽略
你的PoolList规模只有20-28个元素,这里要注意:我们创建的只是指向列表中已有对象的临时引用,并非新的对象实例。这种局部变量对JVM来说完全没有性能负担,垃圾回收机制处理这类短生命周期的变量效率极高,几乎不会产生任何额外开销。
反而第一种方案中重复调用poolList.getPoolList().get(i),如果getPoolList()或get(i)方法内部存在哪怕一点点额外逻辑(比如集合边界检查、微小计算),多次调用反而可能比创建临时变量带来更多性能损耗——哪怕没有,代码冗余带来的维护成本也远大于这点微乎其微的性能差异。
3. 符合代码设计的DRY原则
第二种方案遵循了**Don't Repeat Yourself(不重复自己)**的设计准则,减少冗余代码,让逻辑更简洁清晰,这是编写高质量代码的基本要求之一。
两种方案代码对比
第一种实现:
for (int i = 0; i < poolList.getPoolList().size(); i++){ if (isTaskExecutable(poolList.getPoolList().get(i).getName())) callableList.add(new ConnectToApiCallable(this.appendPoolApiUrl(poolList.getPoolList().get(i)), poolList.getPoolList().get(i).getName(), poolList.getPoolList().get(i).getType())); else continue; }
第二种实现:
for (int i = 0; i < poolList.getPoolList().size(); i++){ PoolDefinition poolDefinition = poolList.getPoolList().get(i); if (isTaskExecutable(poolDefinition.getName())) callableList.add(new ConnectToApiCallable(this.appendPoolApiUrl(poolDefinition), poolDefinition.getName(), poolDefinition.getType())); else continue; }
额外优化建议
如果想让代码更简洁,还可以使用增强for循环(foreach),可读性会进一步提升,性能和第二种方案基本一致:
for (PoolDefinition poolDefinition : poolList.getPoolList()) { if (isTaskExecutable(poolDefinition.getName())) { callableList.add(new ConnectToApiCallable(this.appendPoolApiUrl(poolDefinition), poolDefinition.getName(), poolDefinition.getType())); } }
内容的提问来源于stack exchange,提问作者Maciaz
相关产品推荐
相关产品推荐

