前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java Generator

Java Generator

作者头像
java架构师
发布2019-02-22 15:15:06
6620
发布2019-02-22 15:15:06
举报
文章被收录于专栏:Java架构师进阶Java架构师进阶

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

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

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

5 */

6 public interface Generator {

7 T next();

8 }

CommonGenerator:

1 /**

2 * CommonGenerator继承Generator泛型接口,实现通过next不断返回实例

3 * @author Jian

4 * @param

5 */

6 public class CommonGenerator implements Generator{

7 private Class type;

8 /**

9 * CommonGenerator Constructor

10 * @param type

11 */

12 public CommonGenerator(Class 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 Generator create(Class type){

32 return new CommonGenerator(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 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

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.12.11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云直播
云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档