学习了Think in java 的 第十七章 容器的深入研究后,我了解了一个Generator类。
我的理解是,Generator类使用来根据传入的Class类型,来创建对象的类。首先看一下代码:
package com.example.demo.sjms.GeneratorTest; /** * @Author: caesar * @Date:2020年11月26日 09:11:58 * @Description: Generator类 */ public interface Generator<T> { T next(); }
package com.example.demo.sjms.GeneratorTest; /** * @Author: caesar * @Date:2020年11月26日 09:11:20 * @Description: Generator实现类 */ public class GeneratorImpl<T> implements Generator<T>{ private Class<T> clazz; public GeneratorImpl(Class<T> clazz){ this.clazz = clazz; } @Override public T next() { try{ return clazz.newInstance(); }catch(Exception e){ throw new RuntimeException(e); } } public static <T> Generator<T> getGenerator(Class<T> clazz){ return new GeneratorImpl<T>(clazz); } }
/** * @Author: caesar * @Date:2020年11月26日 09:11:43 * @Description: 实体类 */ public class CountedObject { private static long counter = 0; private final long id = counter++; public long id(){ return id; } public String toString(){ return "CountedObject " + id; } }
测试类:
package com.example.demo.sjms.GeneratorTest; /** * @Author: caesar * @Date:2020年11月26日 09:11:02 * @Description: 测试类 */ public class Test { public static void main(String[] args) { Generator<CountedObject> generatorImpl = GeneratorImpl.getGenerator(CountedObject.class); for (int i = 0; i < 4; i++) { System.out.println(generatorImpl.next()); } } }
我认位这个类存在的原因是,首先,new一个类可以手动new可以通过Class来反射创建,但是呢,比如有一个方法,需要根据你传入的类型来创建对应的对象,你怎搞,当然可以传入类型,在方法中通过反射来创建类。那么,突然想到了,为什么不把这个创建过程给他封装成类呢,这样的话,直接给方法传入一个泛型的类,这个类用于创建对象,直接传入后,调用方法进行创建,完事。