汎用インタフェース

1551 ワード

// 
public interface Generator<T>{
	T next();
}
//Coffee.java
public class Coffee{
	private static long counter = 0;
	private final long id =counter++;
	public String toString(){
		return getClass().getSimpleName()+" "+id;
	}
}
// coffee   
public class Latte extends Coffee{}

public class Mocha extends Coffee{}

// Gernerator<Coffee> 
import java.util.*;
public class CoffeeGenerator implements Generator<Coffee>,Iterable<Coffee>{

	private Class[] types={Latte.class,Mocha.class};
	private static Random rand = new Random(47);
	public CoffeeGenerator(){}
	private int size=0;
	public CoffeeGenerator(int sz){size=sz;}
	public Coffee next(){
		try{
			return (Coffee)types[rand.nextInt(types.length)].newInstance();
		}
		catch(Exception e){
			throw new RuntimeException(e);
		}
	}
	class CoffeeIterator implements Iterator<Coffee>{
		int count =size;
		public boolean hasNext(){
			return count>0;
			}
		public Coffee next(){
			count--;
			return CoffeeGenerator.this.next();
		}
		public void remove(){
			throw new UnsupportedOperationException();
		}
	};
	public Iterator<Coffee> iterator(){
		return new CoffeeIterator();
	}
	
	public static void main(String[] args) {
		CoffeeGenerator gen =new CoffeeGenerator();
		for (int i =0;i<2 ;i++ ) 
			System.out.println(gen.next());	
			
		// , gen.next();  0 1 3 5, c,  0 1 2 3。
		
		for (Coffee c:new CoffeeGenerator(2)) 
			System.out.println(gen.next());	
			
    }
}


 :
Mocha 0
Latte 1
Latte 3
Mocha 5

 : 0 1 2 3?