为不可变数据类型实现迭代器

爵士乐

对于我当前的大学课程,我们要求为不可变数据类型实现一个Iterator。到目前为止,还算不错,这看起来是这样的:

public Iterator<T> iterator(){
    return new Iterator<T>() {
        private int index = 0;

        @Override
        public boolean hasNext() {
            //hasNext implementation
        }

        @Override
        public T next() {
            //Next Implementation
        }
    };

我使用了一个可变变量(索引),该变量指向数据类型中的当前位置。该练习要求我们使每个成员变量都为final(对于不可变数据类型有意义),但还要求我们使迭代器final(索引)中的每个成员变量都为final。这就是让我感到困惑的原因,因为我看不到没有可变变量的数据类型的迭代方法,特别是因为您不能从next()方法内部更改迭代器...我不想解决该问题,我只想知道,这是否可行,也许对解决方案有一点提示...谢谢!

安迪·特纳(Andy Turner)

如果使每个成员变量final都是您的要求,则可以将其index放入数组:

public Iterator<T> iterator(){
    return new Iterator<T>() {
      private final int[] index = {0};
      // ...
    };
}

因为数组元素的保留是可变的,即使对其的引用是final但这会使代码变得更加混乱,因为在index[0]各处使用而不是just index

迭代器本质上是可变的。我无法想到使它们不可变,因为您希望它们在使用时发生变化。


注意,简单地使所有成员变量final确实会使类型不可变。成员变量还必须引用深度不变的对象。非零长度数组不能完全不变,因为您始终可以重新分配它们的元素。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章