icn*_*icn 15 java iterator iterable
我正在尝试理解Java Iterator和Iterable接口
我正在写这门课
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在同一个班.他们做不同的事情.迭代器自然是有状态的 - 当你迭代使用它时,它必须更新它的世界观.但是,迭代只需要能够创建新的迭代器.特别是,您可以让几个迭代器同时在同一个原始迭代上工作.
你当前的方法非常好 - 我会改变实施的各个方面,但在责任分离方面却很好.
你第一次尝试就走上了正轨.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)
| 归档时间: |
|
| 查看次数: |
38308 次 |
| 最近记录: |