对于我当前的大学课程,我们要求为不可变数据类型实现一个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()方法内部更改迭代器...我不想解决该问题,我只想知道,这是否可行,也许对解决方案有一点提示...谢谢!
如果使每个成员变量final
都是您的要求,则可以将其index
放入数组:
public Iterator<T> iterator(){
return new Iterator<T>() {
private final int[] index = {0};
// ...
};
}
因为数组元素的保留是可变的,即使对其的引用是final
。但这会使代码变得更加混乱,因为在index[0]
各处使用而不是just index
。
迭代器本质上是可变的。我无法想到使它们不可变,因为您希望它们在使用时发生变化。
注意,简单地使所有成员变量final
确实会使类型不可变。成员变量还必须引用深度不变的对象。非零长度数组不能完全不变,因为您始终可以重新分配它们的元素。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句