Java Generator

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

若是想学习Java工程化、高性能及分布式、深刻浅出。微服务、Spring,MyBatis,Netty源码分析的朋友能够加个人Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给你们。设计模式

一、什么是Java Generator
  关于Generator个人理解主要以下,若有不妥,但愿你们指正!分布式

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

注意:有些博主觉得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()方法返回建立对象。测试

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

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

相关文章
相关标签/搜索