zoukankan      html  css  js  c++  java
  • Java Generator

      以前我以为只有Python才会有generator,看来当时的我才年轻,后来认真研读《Thinking in Java》之后大有感悟,原来Java亦有generator,故做一次记录分享。过程中主要通过具体代码展示笔记简单比较Python generator来加深理解。

    1、什么是Java Generator

      关于Generator我的理解主要如下,如有不妥,希望大家指正!

      (1)python中这样理解:在一个过程中一边循环一边计算返回,能让单独的循环功能模块(也可以理解为一个单线程)不断“挂起”生成结果而不会一直循环到return为止。 其中能说明的就是求斐波拉契数列,关键字yield是不断返回下一个b的值,也就是return next()

        注意:有些博主以为Python协程中有yield关键字,所以跟generator是一回事,但是我不这么认为。

    1 def fib(max):
    2     n, a, b = 0, 0, 1
    3     while n < max:
    4         #之前是print (b)
    5         yield b
    6         a, b = b, a + b
    7         n = n + 1

    输出结果:

    #第一次next():1
    print(fib(1))
    #第二次next():2
    print(fib(2))
    #第三次next():3
    print(fib(2))

      (2)Java中这样理解:将泛型应用于接口,接口必须有返回类型为泛型T的next()方法,是一种专门负责创建对象的类。在很多设计模式都会用到(比如工厂方法模式),类似于Iterable对象中使用使用next()不断获得下一个值,这里泛型接口中的next()方法返回创建对象。

    2、实现一个CommonGenerator通用生成器

      实现一个通用生成器,通过next不断返回一个对象的实例

    interface Generator

    1 /**
    2  * Generator泛型接口 
    3  * @author Jian
    4  * @param <T>
    5  */
    6 public interface Generator<T> {
    7     T next();
    8 }

    CommonGenerator:

     1 /**
     2  * CommonGenerator继承Generator泛型接口,实现通过next不断返回实例
     3  * @author Jian
     4  * @param <T>
     5  */
     6 public class CommonGenerator<T> implements Generator<T>{
     7     private Class<T> type;
     8     /**
     9      * CommonGenerator Constructor
    10      * @param type
    11      */
    12     public  CommonGenerator(Class<T> type) {
    13         this.type = type;
    14     }
    15     /**
    16      * next()不断返回xxx.class的对象
    17      */
    18     @Override
    19     public T next() {
    20         try {
    21             //传入class返回对象
    22             return type.newInstance();
    23         } catch (Exception e) {
    24             throw new RuntimeException(e);
    25         }
    26     }
    27     /**
    28      * @param type 传入创建类xxx.class
    29      * @return CommonGenerator实例
    30      */
    31     public static <T> Generator<T> create(Class<T> type){
    32         return new CommonGenerator<T>(type);
    33     }
    34 }

    TestObject:

     1 /**
     2  * 测试类:统计返回测试类的引用实例的数目
     3  * @author Jian
     4  *
     5  */
     6 public class TestObject {
     7     private static long counter= 0;//统计计数器
     8     public String toString() {
     9         //注意:这里return中不能用this,否则会出现递归
    10         return "TestObject " + (counter++);
    11     }
    12 }

    MainClass:

    1 public class MainClass {
    2     public static void main(String[] args) {
    3         Generator<TestObject> generator = new CommonGenerator<>(TestObject.class);
    4         for(int i=0;i<3;i++) {
    5             //generator.next()返回对象,输出调用toString方法
    6             System.out.println(generator.next());
    7         }
    8     }
    9 }

    输出:

    TestObject 0
    TestObject 1
    TestObject 2
  • 相关阅读:
    SpringBoot 启动报 No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' available 异常
    踩坑记录:springboot 不识别properties配置文件
    简单说一下MySQL sum(1) count(1) 区别和联系
    @EnableConfigServer 注解无法导入
    给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
    阿里云服务器
    穷爸爸富爸爸观后感- 生活的抉择
    java request get 请求乱码解决
    递归与八皇后问题
    编译型语言和解释型语言
  • 原文地址:https://www.cnblogs.com/jian0110/p/9341175.html
Copyright © 2011-2022 走看看