调用一个方法n次:我应该使用转换后的for-each循环还是传统的for循环?

Arv*_*nem 4 java foreach for-loop premature-optimization

鉴于需要循环到任意int值,将值转换为数组并为每个数组转换,或仅使用传统的for循环是否更好的编程实践?

仅供参考,我正在计算6个骰子的多个投掷中的5个和6个结果("命中")的数量.我的任意int值是dicePool,它表示多次抛出的次数.

据我了解,有两种选择:

  1. 将dicePool转换为数组并为每个数组转换:

    public int calcHits(int dicePool) {
       int[] dp = new int[dicePool];
       for (Integer a : dp) {
         // call throwDice method
       }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用传统的for循环:

    public int calcHits(int dicePool) {
       for (int i = 0; i < dicePool; i++) {
         // call throwDice method
       }
    }
    
    Run Code Online (Sandbox Code Playgroud)

我的观点是选项1是笨拙的代码并且涉及不必要的数组创建,即使for-each循环比选项2中的传统for循环更有效.

Gor*_*son 12

此时,速度并不重要(插入过早优化注释;).重要的是你能够多快地理解代码的作用,即调用方法的dicePool时间.

第一种方法分配一个大小的数组dicePool并迭代它的值,这恰好运行循环体dicePool时间(我会假装你的意思int而不是Integer避免不相关的自动装箱问题).这对于运行代码的计算机而言可能效率低下,但更重要的是,对于人类阅读代码而言,这是低效的,因为它在概念上远离您想要完成的任务.具体来说,您强制读者考虑您刚刚创建的新数组,以及变量的值a,即循环的每次迭代都将为0,即使这些都与您的最终目标无关.

任何查看第二种方法的Java程序员都会意识到你正在dicePool通过i"向上计数"来执行循环体时间dicePool.虽然后一部分并不是特别重要,但开始正是你的意思.使用这种常见的Java习语可以最大限度地减少读者需要考虑的无关内容,因此它是最佳选择.

如有疑问,请简单操作.:d