Вы были на ходу с первой попытки.MyClass
требуется только для реализации Iterable<String>
, что, в свою очередь, требует от вас Iterator<String>
реализации для возврата из Iterable<String>.iterator()
.
Нет необходимости ставить MyClassIterator
вне MyClass
, потому что в большинстве случаев вам даже никогда не понадобится напрямую использовать Iterator<String>
(он неявно используется синтаксисом for .. in ..
для Iterable<String>
s) и во всех других случаях интерфейс является достаточным, если вы фактически не добавите в реализацию дополнительное поведение (что вам, вероятно, никогда не понадобится).
Вот как я это сделаю, см. комментариивстроенный:
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();
}
};
}
}