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

icn*_*icn 15 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();
        }
    }   
}
Run Code Online (Sandbox Code Playgroud)

它似乎工作.

我应该:

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

}
Run Code Online (Sandbox Code Playgroud)

或者我应该把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();
        }
    }   
Run Code Online (Sandbox Code Playgroud)

哪一个更好?

Jon*_*eet 33

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

你当前的方法非常好 - 我会改变实施的各个方面,但在责任分离方面却很好.

  • @icn:保持MyClassIterator作为嵌套类很好.(迭代器,但不是Interator.)我建议你把它作为私人静态决赛课.毕竟,您无需在其他任何地方直接引用它. (2认同)
  • @Jon - 你为什么要让内部类静态? (2认同)

Ste*_*sen 7

你第一次尝试就走上了正轨.MyClass只需要实现Iterable<String>,这反过来要求您提供Iterator<String>从中返回的实现Iterable<String>.iterator().

没有必要把它放在MyClassIterator外面MyClass因为在大多数情况下你甚至不需要直接使用它Iterator<String>(它被s for .. in ..语法隐式使用Iterable<String>),而在所有其他情况下,接口就足够了,除非你真的在实现中添加了额外的行为(你可能不需要这样做).

以下是我的方法,请参阅内联评论:

import java.util.Iterator;

class MyClass implements Iterable<String>{
    public String[] a=null; //make this final if you can
    public MyClass(String[] arr){
        a=arr; //maybe you should copy this array, for fear of external modification
    }

    //the interface is sufficient here, the outside world doesn't need to know
    //about your concrete implementation.
    public Iterator<String> iterator(){
        //no point implementing a whole class for something only used once
        return new Iterator<String>() {
            private int count=0;
            //no need to have constructor which takes MyClass, (non-static) inner class has access to instance members
            public boolean hasNext(){
                //simplify
                return count < a.length;
            }
            public String next(){
                return a[count++]; //getting clever
            }

            public void remove(){
                throw new UnsupportedOperationException();
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)