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

  • 相关阅读:
    [翻译]windows下 连接到 bitnami的phpmyadmin
    Redmine 和GitBlit仓库服务器整合
    Xshell出现要继续使用此程序必须应用到最新的更新或使用新版本
    Codeigniter 列出所有控制器和控制器的方法(类似路由列表)
    FastStone Capture 文件名设置小记录
    [转]sourceforge文件下载过慢
    Cacti 添加 CPU 监听
    Cacti 发送警告邮件
    尝试让Virtualbox的Ubuntu可以调整分辨率
    Html5+离线打包创建本地消息
  • 原文地址:https://www.cnblogs.com/mcjhcnblogs/p/14041103.html
Copyright © 2020-2023  润新知