/*
* 2018年3月27日11:22:22
* 代码目的:通过让类型实现Iterable接口,使得IterableClass对象可以用于foreach语句
* public interface Iterable<T>实现这个接口允许对象成为 "foreach" 语句的目标。
体会匿名内部类的使用。和实现Iterable接口
* */
//: holding/IterableClass.java
// Anything Iterable works with foreach.
import java.util.*;
public class IterableClass implements Iterable<String> {
protected String[] words = ("And that is how " +
"we know the Earth to be banana-shaped.").split(" ");
//使用匿名内部类,在调用iterator方法时,返回了一个实现了Iterator接口的匿名类的对象
//迭代器的工作原理与容器中元素的添加相互独立,互不影响。
public Iterator<String> iterator() {
return new Iterator<String>() {
private int index = 0;
public boolean hasNext() {
return index < words.length;
}
public String next() { return words[index++]; }
public void remove() { // Not implemented
throw new UnsupportedOperationException();
}
};
}
public static void main(String[] args) {
for(String s : new IterableClass())
System.out.print(s + " ");
}
} /* Output:
And that is how we know the Earth to be banana-shaped.
*///:~
/*
* 2018年3月27日14:53:21
* 代码目的:
* 复习匿名内部类的使用.
* 每个内部类都能独立的继承自一个接口的实现,所以无论外围类是否已经继承了某个接口的实现,
* 对于内部类而言都没有影响。体会这句话的含义。
* 虽然外部类继承了实现了Iterable接口的IterableClass,但在MultiIterableClass类内部
* 的匿名内部类可以仍然实现Iterable接口以提供不同的迭代策略。
*
* 如果没有内部类提供的,可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。
* 从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类
* 有效的实现了“多重继承”,也就是说内部类允许继承多个非接口类型。
*
* 在MultiIterable类中,调用方法生成了许多实现了Iterable接口的匿名类对象的引用,提供了
* 多种迭代策略。
* */
//: holding/MultiIterableClass.java
// Adding several Adapter Methods.
import java.util.*;
public class MultiIterableClass extends IterableClass {
//reverserd方法返回了一个实现了Iterable<String>接口的类的对象,同时把该对象上转型
//为Iterable<String>引用。
public Iterable<String> reversed() {
return new Iterable<String>() {
public Iterator<String> iterator() {
return new Iterator<String>() {
int current = words.length - 1;
public boolean hasNext() { return current > -1; }
public String next() { return words[current--]; }
public void remove() { // Not implemented
throw new UnsupportedOperationException();
}
};
}
};
}
//随机访问迭代器,实现原理与前面一样。使用了匿名类
public Iterable<String> randomized() {
return new Iterable<String>() {
public Iterator<String> iterator() {
List<String> shuffled =
new ArrayList<String>(Arrays.asList(words));
Collections.shuffle(shuffled, new Random(47));
return shuffled.iterator();
}
};
}
public static void main(String[] args) {
MultiIterableClass mic = new MultiIterableClass();
//熟悉这种用法
for(String s : mic.reversed())
System.out.print(s + " ");
System.out.println();
for(String s : mic.randomized())
System.out.print(s + " ");
System.out.println();
for(String s : mic)
System.out.print(s + " ");
}
} /* Output:
banana-shaped. be to Earth the know we how is that And
is banana-shaped. Earth that how the be And we know to
And that is how we know the Earth to be banana-shaped.
*///:~