package org.nutz.lang.random;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import org.nutz.lang.Lang;
import org.nutz.lang.Mirror;
public abstract class EnumRandom<T extends Enum<?>> implements Random<T> {
private RecurArrayRandom<T> r;
@SuppressWarnings("unchecked")
protected EnumRandom() {
try {
Class<T> type = (Class<T>) Mirror.getTypeParams(this.getClass())[0];
Field[] fields = type.getFields();
List<T> list = new ArrayList<T>(fields.length);
for (Field f : fields) {
if (f.getType() == type) {
list.add((T) f.get(null));
}
}
T[] ens = (T[]) Array.newInstance(type, list.size());
this.r = new RecurArrayRandom<T>(list.toArray(ens));
}
catch (Exception e) {
throw Lang.wrapThrow(e);
}
}
public T next() {
return r.next();
}
}