欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

【Java学习】泛型接口与Generator进阶,javagenerator进阶

来源: javaer 分享于  点击 5894 次 点评:140

【Java学习】泛型接口与Generator进阶,javagenerator进阶


【Java学习】代理 —— 学习自《Thinking In Java》


这里学习的内容要接着上一个内容。即《泛型接口学习》。

参考书上内容,我们可以很容易的定义一个填充Collection的方法:

public static <T> Collection<T> fill(Collection<T> collection,
			Generator<T> generator, int n) {
		for (int i = 0; i < n; i++) {
			collection.add(generator.next());
		}
		return collection;
	}
这个方法首先定义一个泛型T,返回这个泛型T的Collection接口的实例,

传入的参数有3个,

第一个Collection就是你要填充的Collection接口的实例,

第二个Generator就是你写的生成器(后面的代码),

第三个int就是填充的数量了,当然这里你可以灵活的定义,不一定是按这样写。

最后返回一个完成填充的Collection。


这里,我用2个Generator作示例:

// 通过Generator填充
		Collection<Integer> collectionFibonacci = fill(
				new ArrayList<Integer>(), new Fibonacci(), 20);
		for (Integer integer : collectionFibonacci) {
			System.out.print(integer + " ");
		}
		System.out.println();

		// 通过Generator填充类型
		Collection<BaseClass> collectionBaseClass = fill(
				new ArrayList<BaseClass>(), new BaseClassGenerator(), 8);
		for (BaseClass baseClass : collectionBaseClass) {
			System.out.println(baseClass.toString());
		}
		System.out.println();

第一个是Integer的Fibonacci数列生成器,第二个是自定义的一个BaseClass生成器(代码在下面)。

通过刚才的fill方法,填充完之后打印出来。


BaseClass相关的代码在这里:

class BaseClass {

	private static long counter = 0;
	private final long id = counter++;

	public String toString() {
		return getClass().getSimpleName() + " " + id;
	}
}

class AClass extends BaseClass {
}

class BClass extends BaseClass {
}

class CClass extends BaseClass {
}

class DClass extends BaseClass {
}

class BaseClassGenerator implements Generator<BaseClass>, Iterable<BaseClass> {

	@SuppressWarnings("rawtypes")
	private Class[] types = { AClass.class, BClass.class, CClass.class,
			DClass.class };
	private static Random random = new Random();
	private int size = 0;

	public BaseClassGenerator() {

	}

	public BaseClassGenerator(int size) {
		this.size = size;
	}

	@Override
	public BaseClass next() {
		try {
			return (BaseClass) types[random.nextInt(types.length)]
					.newInstance();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	@Override
	public Iterator<BaseClass> iterator() {
		return new Iterator<BaseClass>() {

			@Override
			public boolean hasNext() {
				return size > 0;
			}

			@Override
			public BaseClass next() {
				size--;
				return BaseClassGenerator.this.next();
			}

			@Override
			public void remove() {
				throw new UnsupportedOperationException();
			}
		};
	}

}
先定义一个BaseClass作为基类,并且toString方法实现返回Class信息和计数。

定义了A,B,C,D 分别4个Class都是BaseClass的子类。


定义一个Generator类,用来生成上面4个子类之一。

继承了Generator接口,表明可以作为生成器,Iterable接口就不说了。
其中,Class[]数组里包含了上述4个类的Class信息,后面可以通过newInstance()生成实例。

这个Generator的作用就是,随机返回上述4个类的其中1个实例。


最后main的打印结果是这样的:

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 
AClass 0
BClass 1
BClass 2
CClass 3
AClass 4
DClass 5
DClass 6
CClass 7


其中,Class[]数组里包含了上述4个类的Class信息,后面可以通过newInstance()生成实例。

相关文章

    暂无相关文章
相关栏目:

用户点评