Generator的理解

学习了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来反射创建,但是呢,比如有一个方法,需要根据你传入的类型来创建对应的对象,你怎搞,当然可以传入类型,在方法中通过反射来创建类。那么,突然想到了,为什么不把这个创建过程给他封装成类呢,这样的话,直接给方法传入一个泛型的类,这个类用于创建对象,直接传入后,调用方法进行创建,完事。

posted @ 2020-11-26 10:46  码在江湖  阅读(226)  评论(0)    收藏  举报