单例通常会延迟实例化自己,有时,如果对象足够重,则可以延迟实例化类字段。

通常,在走惰性路线时,getter方法(或accessor )必须具有一段代码,该代码块在返回对象之前检查对象是否已实例化(如果不是,则需要实例化)。 一旦实例化了对象,该检查就没有意义。 它只会减慢已经(通常)使用同步或锁定进行阻塞的方法的速度。 让我们看一下删除该代码的方法,对吧?

免责声明

我没有想到这个。 我是从Venkat Subramaniam的Java函数编程中获得的。 我强烈推荐这本书和作者。 Venkat所阅读的所有内容都做得很好,而且易于学习。

它是如何工作的?

基本思想是:

  1. 将延迟实例化的字段替换为所需类型的供应商。
  2. 供应商实例化该对象(但尚未返回)
  3. 然后将字段设置为仅返回实例化对象的新Supplier
  4. 返回实例

因此,让我们看看实际情况。 我们将有一个名为Holder的类,该类希望延迟实例化Heavy类型的对象。 此代码直接从Venkat的书中编译而成:

public class Holder
{private Supplier heavy = () -> createAndCacheHeavy();public Heavy getHeavy(){return heavy.get();}private synchronized Heavy createAndCacheHeavy(){class HeavyFactory implements Supplier{private final Heavy heavyInstance = new Heavy();public Heavy get(){return heavyInstance;}}if(!HeavyFactory.class.isInstance(heavy)){heavy = new HeavyFactory();}return heavy.get();}
}

现在,此代码可以正常工作,但是我发现createAndCacheHeavy的实现不必要地令人困惑。 第一次看到此代码时,我花了很长时间才弄清楚它在做什么。

因此,让我们对其进行一些修改,对吧? 我们将使它看起来像是按照我之前列出的步骤进行操作。

private Heavy createAndCacheHeavy()
{Heavy instance = new Heavy();heavy = () -> instance;return instance;
}

那不是更好吗? 我认为,这比以前更简单,更干净。 而且仍然有效! 好吧,这里有一个小警告:为了使代码具有线程安全性,您需要同步getInstance()方法而不是createAndCacheHeavy方法。 与Venkat的代码相比,这种更改会使代码的速度稍慢一些,因为一旦HeavyFactory就绪,他的代码就不会使用同步。 但是它仍然比每次都需要同步和有条件检查的旧方法要快。

因此,这是一些有用的代码,但是您是否想在每次懒惰地实例化某些东西时都键入该代码? 我不这么认为。 因此,让我们创建一个可重用的类,使我们的生活更加轻松。

但是首先,只是为了向您展示它变得更容易使用,让我向您展示它的使用情况。

Supplier<Heavy> heavy = LazilyInstantiate.using(() -> new Heavy());

而已! 让我们更仔细地看一下它,并深入研究它,然后再进行研究。

该行的声明位与以前相同; 一家名为Heavy的重型供应商。 但是随后我们调用了LazilyInstantiate的静态方法,该方法原来是返回工厂实现Supplier的LazilyInstantiate对象的静态工厂方法。 传递给该方法的参数是在那里的“重型供应商”,因此用户可以为实例化器提供正确的代码以实例化对象。

那么,您是否对它的工作方式感到好奇? 好了,这是LazilyInstantiate的代码:

public class LazilyInstantiate implements Supplier
{public static  LazilyInstantiate using(Supplier supplier){return new LazilyInstantiate<>(supplier);}public synchronized T get(){return current.get();}private LazilyInstantiate(Supplier supplier){this.supplier = supplier;this.current = () -> swapper();}private final Supplier supplier;private Supplier current;private T swapper(){T obj = supplier.get();current = () -> obj;return obj;}
}

您可能会发现我的方法的顺序与通常的方法有所不同。 我更喜欢先拥有公共资源,然后拥有私有和受保护包,然后拥有私有资源。 在这些块中,我执行静态字段,然后构造函数,然后是静态方法,然后是普通字段,然后是普通方法。 通常,对于用户阅读我的代码而言,这似乎按照最重要的顺序将其排序为最不重要。

您可以随意将代码复制到任何地方,也可以在github上查看我的function-java库 ,该库具有此类的完整文档版本(func.java.lazy.LazilyInstantiate)和许多其他有用的函数类。

翻译自: https://www.javacodegeeks.com/2015/01/java-8-functional-programming-lazy-instantiation.html

Java 8函数式编程:延迟实例化相关推荐

  1. 阅读笔记–Java 8函数式编程,建议看书,作者高屋建瓴

    阅读笔记–Java 8函数式编程 书籍代码 为什么需要再次修改Java 1996年1月,Java1.0发布,商业发展需要更复杂的应用,跑在功能强大的多核CPU机器上.带有高效运行时编译器的Java虚拟 ...

  2. java8 函数式编程_如何使用Java 8函数式编程生成字母序列

    java8 函数式编程 我偶然发现了用户" mip"一个有趣的堆栈溢出问题 . 问题是: 我正在寻找一种生成字母序列的方法: A, B, C, ..., Z, AA, AB, AC ...

  3. 如何使用Java 8函数式编程生成字母序列

    我偶然发现了用户" mip"一个有趣的堆栈溢出问题 . 问题是: 我正在寻找一种生成字母序列的方法: A, B, C, ..., Z, AA, AB, AC, ..., ZZ. 可 ...

  4. Java 8 函数式编程学习笔记

    Java 8 函数式编程学习笔记 @(JAVASE)[java8, 函数式编程, lambda] Java 8 函数式编程学习笔记 参考内容 Java 8中重要的函数接口 扩展函数接口 常用的流操作 ...

  5. 【Java】函数式编程学习笔记——Stream流

    学习视频:https://www.bilibili.com/video/BV1Gh41187uR?p=1 (1)[Java]函数式编程学习笔记--Lambda表达式 (2)[Java]函数式编程学习笔 ...

  6. Java 代码写的又臭又长,还不会用 Java Stream 函数式编程?

    点击上方"猿芯",选择"设为星标" 后台回复"1024",有份惊喜送给面试的你 原文 https://www.cnblogs.com/Car ...

  7. 深度探秘 Java 8 函数式编程(下)

    函数式编程的益处 更精练的代码 函数编程的一大益处,是用更精练的代码表达常用数据处理模式.函数接口能够轻易地实现模板方法模式,只要将不确定的业务逻辑抽象成函数接口,然后传入不同的lambda表达式即可 ...

  8. Java 8th 函数式编程:lambda 表达式

    Lambda 表达式是 java 8th 给我们带来的几个重量级新特性之一,借用 lambda 表达式可以让我们的程序设计更加简洁.最近新的项目摒弃了 6th 版本,全面基于 8th 进行开发,本文将 ...

  9. 【Java】函数式编程

    1 函数式接口 1.1 概念 函数式接口是有且仅有一个抽象方法的接口,可以包括静态和默认方法. @FunctionalInterface:加上注解,检测是否的函数式接口 @FunctionalInte ...

最新文章

  1. qq邮箱使用技巧学习1
  2. imx6 休眠 功耗 电流_无线物联网和可穿戴设备的低功耗电源测量挑战
  3. 01算法 java_蓝桥杯:基础练习 01字串【JAVA算法实现】
  4. SpringSecurity常用登录认证方案
  5. .Net Core 之 图形验证码 本文介绍.Net Core下用第三方ZKWeb.System.Drawing实现验证码功能。...
  6. Java面向对象㈡ -- 继承与多态
  7. python爬虫之数据提取Xpath(爬取起点中文网案例)
  8. java开发英语词典app_英语词典app哪个好 5款好用的英语词典app推荐
  9. 【千律】OpenCV基础:图像边缘检测 -- Laplacian 算子和 LoG 算子
  10. 1209 实验三同学评论
  11. 服务器没有显示器能接笔记本吗,笔记本能连显示器吗,笔记本怎么才能接显示器(图文)...
  12. bzoj 2075: [POI2004]KAG
  13. 黑马程序员《JavaWeb程序设计案例教程》_课后习题答案
  14. IOS 改变导航栏颜色
  15. 极简WEB文件管理工具(群晖)——TinyManager
  16. 电力设备事故演练仿真培训_电力事故VR培训_广州华锐互动
  17. Appium学习笔记17-手机操作API之分辨率
  18. vue中实现动画效果--三种方式
  19. 北京星美影院等五家企业因拒收现金被央行警告处罚
  20. java 获取年鱼儿_泼墨,造一匹快马,追回十年前姑娘

热门文章

  1. Sentinel控制台
  2. windows mysql memcached_Memcached在Windows下的安装
  3. 服务器复制不了文档,服务器复制粘贴不了
  4. 一文理清Http2.0
  5. 微软 azure_在Microsoft Azure上运行Eclipse MicroProfile
  6. 从Speedment 3.0.17或更高版本的事务轻松返回值
  7. gitlab10.x迁移_1.x到2.x的迁移:可观察与可观察:RxJava FAQ
  8. wildfly管理控制台_WildFly管理控制台已更新–请求反馈
  9. java编译器jdk版本_以编程方式确定Java类的JDK编译版本
  10. jboss调jvm参数_在同一台机器上启动多个JBoss A-MQ JVM