在同一类中实现Java Iterator和Iterable?


问题内容

我试图了解Java IteratorIterable接口

我正在写这堂课

class MyClass implements Iterable<String> {
    public String[] a = null;
    public MyClass(String[] arr) {
        a = arr;    
    }

    public MyClassIterator iterator() {
        return new MyClassIterator(this);
    }

    public class MyClassIterator implements Iterator<String> {
        private MyClass myclass = null;
        private int count = 0;
        public MyClassIterator(MyClass m) {
            myclass = m;    
        }

        public boolean hasNext() {
            return count < myclass.a.length;
        }
        public String next() {
            int t = count;
            count++;
            return myclass.a[t];
        }

        public void remove() {
            throw new UnsupportedOperationException();
        }
    }   
}

它似乎正在工作。

我应该有:

Myclass implements Iterable<Stirng>, Iterator<String> {

}

或者我应该把MyClassIterator外面MyClass

class MyClass implements Iterable<String> {
    public String[] a = null;
    public MyClass(String[] arr) {
        a = arr;    
    }
    public MyClassIterator iterator() {
        return new MyClassIterator(this);
    }
}


    public class MyClassIterator implements Iterator<String> {
        private MyClass myclass = null;
        private int count = 0;
        public MyClassIterator(MyClass m) {
            myclass = m;    
        }

        public boolean hasNext() {
            return count < myclass.a.length;
        }
        public String next() {
            int t = count;
            count++;
            return myclass.a[t];
        }

        public void remove() {
            throw new UnsupportedOperationException();
        }
    }

哪一个更好?


问题答案:

你应该几乎 从来没有 同时实现Iterable,并Iterator在同一个班。他们做不同的事情。迭代器自然是 有状态的
-当您迭代使用它时,它必须更新其世界观。但是,迭代器仅需要能够创建新的迭代器。特别是,您可能有多个迭代器同时处理同一个原始可迭代对象。

您当前的方法几乎可以-我会更改实现的某些方面,但是就职责分离而言还可以。