【问题标题】:implementing a loop using final variables使用最终变量实现循环
【发布时间】:2013-03-21 18:34:25
【问题描述】:

有没有办法使用最终变量实现循环? 我的意思是当您在初始化后不允许更改任何内容时,将运行指定次数的迭代的循环!

【问题讨论】:

  • 你的问题不清楚...
  • 见鬼,它可以像for (final AtomicInteger i = new AtomicInteger(0); i.get() < MAX; i.incrementAndGet()) 一样简单。最终变量并不意味着不可变对象。

标签: java variables loops static final


【解决方案1】:

是否允许递归,或者您真的需要像forwhile 这样的循环构造?如果可以使用递归,那么:

void loop(final int n) {
  if (n == 0) {
    return;
  } else {
    System.out.println("Count: " + n);
    loop(n-1);
  }
}

【讨论】:

    【解决方案2】:

    一种方法是创建一个代表任意范围的Iterable<Integer> 类(实际上不必将所有值存储在一个列表中):

    public static class FixedIntRange implements Iterable<Integer> {
        private final int min;
        private final int max;
    
        public FixedIntRange(final int min, final int max) {
            this.min = min;
            this.max = max;
        }
    
        @Override
        public Iterator<Integer> iterator() {
            return new Iterator<Integer>() {
                private Integer next = FixedIntRange.this.min;
    
                @Override
                public boolean hasNext() {
                    return next != null;
                }
    
                @Override
                public Integer next() {
                    final Integer ret = next;
                    next = ret == max ? null : next + 1;
                    return ret;
                }
    
                @Override
                public void remove() {
                    throw new UnsupportedOperationException();
                }
            };
        }
    }
    

    然后正常迭代它:

    for (final int i : new FixedIntRange(-10, 20)) {
        // this will be run for each i in the range [-10, 20]
    }
    

    【讨论】:

      【解决方案3】:

      创建一个大小为所需迭代次数的数组,然后在 for-each 循环中使用它:

      public class Test {
        public static void main(String[] args) {
          final int N = 20;
          final int[] control = new int[N];
          for(final int i : control){
            System.out.println(i);
          }
        }
      }
      

      这里的诀窍是迭代索引是由编译器生成的,作为增强 for 语句的一部分,并且不使用任何用户声明的变量。

      【讨论】:

        【解决方案4】:

        类似的东西-

        final int max = 5;
        for(int i=0; i<max; i++) {}
        

        或者另一个有趣的-

        final boolean flag = true;
        while(flag) {
           // keep doing your stuff and break after certain point
        }
        

        还有一个-

        List<String> list = ......
        for(final Iterator iterator = list.iterator(); iterator.hasNext(); ) {
        }
        

        【讨论】:

        • 不确定iflag 是否违反“初始化后不允许更改任何内容”的规则
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-29
        • 2021-03-23
        相关资源
        最近更新 更多