说到在java中创建类的对象,一般都会想到用new关键字来实现。但是在某些特定情况下使用new来创建对象会显得更加麻烦,尤其在给容器初始化赋值的时候。
最近在看《Thinking in Java》这本书时,对容器类有了更加深入的理解,而在使用对象填充容器时遇到了Generator这个知识点, 通过使用Generator,可以很方便地为任何类提供类的对象,而不是通过new的方式。下面通过一个实例演示学习的过程。

1、申明一个Generator接口,提供一个next()方法,用以返回一个新的类对象。

public interface Generator<T> {
   T next();
}

2、定义一个BasicGenerator类,对Generator接口进行实现,用以生成某个类的对象。通过create()方法创建新的对象,使用泛型参数。

package generator;


/**
 * @author wangjie
 * @version 2018/11/19
 * 一个通用的generator
 */
public class BasicGenerator<T> implements Generator<T> {
    private Class<T> type;
    public BasicGenerator(Class<T> type){
        this.type = type;
    }
    @Override
    public T next(){
        try{
            return type.newInstance();
        }catch(Exception e){
            throw new RuntimeException(e);
        }
    }

    public static <T> Generator<T> create(Class<T> type){
        return new BasicGenerator<T>(type);
    }

}

3、定义一个具有默认构造器的简单类:这个类CountedObject能够实现计数功能,告诉我们创建了几个CountedObject实例,并通过toString()方法打印其编号。

package generator;

/**
 * @author wangjie
 * @version 2018/11/19
 */
public class CountedObject {
    private static long counter = 0;
    private final long id = counter++;
    public long id(){ return id; }
    public String toString(){ return "CountedObject " + id; }
}

4、此时,可以使用BasicGenerator很容易地为CountedObject类创建一个Generator:

package generator;

/**
 * @author wangjie
 * @version 2018/11/19
 */
public class BasicGeneratorDemo {
    public static void main(String[] args) {
        Generator<CountedObject> gen = BasicGenerator.create(CountedObject.class);
        for (int i = 0; i < 5; i++) {
            System.out.println(gen.next());
        }
    }
}

5、看看结果:
在这里插入图片描述
可以看到,我们在给CountedObject类创建实例时并没有一个一个通过new去创建,使用Generator方便了许多。通过传入泛型参数,也提高了其通用性。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐