程序员本来就是懒惰的,而similis simili gaudet就像程序是懒惰的一样。 您听说过延迟加载吗? 还是懒惰的单身人士? (不过,我个人更喜欢单一麦芽版本。)如果使用Scala或Kotlin(这也是一种JVM语言)进行编程,则您甚至可以以惰性方式评估表达式。

如果您在Scala中编程,则可以编写

 lazy val z = "Hello" 

并且仅在首次访问z时才对表达式求z 。 如果您使用Kotlin编程,则可以编写如下内容

 val z: String by lazy { "Hello" } 

并且仅在首次访问z时才对表达式求z

Java本身不支持这种惰性评估,但是作为一种功能强大的语言,Java提供了可用于获得相同结果的语言元素。 当Scala和Kotlin给您鱼时,Java教您捕获自己的鱼。 (让我们在这个想法中发挥作用。)

当您在Scala和/或Kotlin中对以上行进行编码时,在后台真正发生的事情是不对表达式进行求值,并且变量将不包含表达式的结果。 相反,这些语言会创建一些虚拟的“ lambda”表达式,这是一个“供应商”,以后将用于计算该表达式的值。

我们可以用Java自己完成。 我们可以使用一个简单的类Lazy提供以下功能:

 public class Lazy implements Supplier {  final private Supplier supplier;  supplied = private boolean supplied = false ;  private T value;  private Lazy(Supplier supplier) {  this .supplier = supplier;  }  public static Lazy let(Supplier supplier) {  return new Lazy(supplier);  }  @Override  public T get() {  if (supplied) {  return value;  }  supplied = true ;  return value = supplier.get();  }  } 

该类具有可用于定义供应商的public static方法let() ,并且在首次调用方法get()会调用此供应商。 使用此类,您可以将以上示例编写为

 var z = Lazy.let( () -> "Hello" ); 

顺便说一句,它似乎比Kotlin版本更简单。 您可以使用库中的类:

 com.javax0  lazylet  1.0.0 

然后您无需将代码复制到您的项目中。 这是一个微型库,仅包含此类和一个内部类,该内部类使Lazy可以在多线程环境中使用。

用法很简单,如单元测试所示:

 private static class TestSupport {  int count = 0 ;  boolean callMe() {  count++;  return true ;  }  }  ...  final var ts = new TestSupport();  var z = Lazy.let(ts::callMe);  if ( false && z.get()) {  Assertions.fail();  }  Assertions.assertEquals( 0 , ts.count);  z.get();  Assertions.assertEquals( 1 , ts.count);  z.get();  Assertions.assertEquals( 1 , ts.count); 

要获取多线程安全版本,可以使用以下代码:

 final var ts = new TestSupport();  var z = Lazy.sync(ts::callMe);  if ( false && z.get()) {  Assertions.fail();  }  Assertions.assertEquals( 0 , ts.count);  z.get();  Assertions.assertEquals( 1 , ts.count);  z.get();  Assertions.assertEquals( 1 , ts.count); 

并获得可以由多个线程使用的Lazy供应商,但仍可以保证作为参数传递的供应商仅传递一次。

给你一条鱼或教你钓鱼

我说要在便签上写上别针:“虽然Scala和Kotlin给您鱼,但是Java教您捕捉自己的鱼。” 这就是我的意思。

许多程序员在不了解程序如何执行的情况下编写程序。 他们使用Java编程并且编写了不错的代码,但是他们不知道底层技术是如何工作的。 他们对类加载器,垃圾回收一无所知。 或者他们知道,但是他们对JIT编译器生成的机器代码一无所知。 或者他们甚至这样做,但他们对处理器缓存,不同的内存类型,硬件体系结构一无所知。 或者他们知道但不了解微电子学和光刻技术,以及集成电路的布局,电子在半导体内部的移动方式,量子力学如何确定计算机的不确定内部工作方式。

我并不是说您必须是物理学家,并且要了解量子力学的复杂细节才能成为优秀的程序员。 但是,我建议您了解日常工作工具下面的几层内容。 如果您使用Kotlin或Scala,则绝对可以使用它们提供的惰性结构。 在这种特定情况下,它们使编程抽象比Java提供的编程抽象高一个级别。 但是,至关重要的是要知道实现的外观。 如果您知道如何钓鱼,则可以购买包装鱼,因为这样您就可以分辨出什么时候才是好鱼。 如果您不知道如何钓鱼,您将依靠那些给您钓鱼的人的怜悯。

翻译自: https://www.javacodegeeks.com/2019/05/lazy-assignment-java.html

Java中的延迟分配相关推荐

  1. Java基础-Java中的内存分配与回收机制

    Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二. 转载于:https://www.cnblogs.com/yinzhengji ...

  2. Java中的堆分配参数总结《对Java的分析总结》(二)

    <对Java的分析总结>-Java中的堆分配参数总结 header 配制说明 -Xms: 设置Java应用程序启动时的初始堆大小 -Xmx: 设置Java应用程序能获得的最大堆大小 -Xs ...

  3. java中堆栈内存_Java堆空间与堆栈– Java中的内存分配

    java中堆栈内存 Sometime back I wrote a couple of posts about Java Garbage Collection and Java is Pass by ...

  4. java中延迟_Java中的延迟分配

    java中延迟 程序员本质上是懒惰的,而similis simili gaudet就像程序是懒惰的一样. 您听说过延迟加载吗? 还是懒惰的单身人士? (不过,我个人更喜欢单一麦芽版本.)如果使用Sca ...

  5. Java中的内存分配

    Java 程序在运行时,需要在内存中的分配空间.为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式. 栈 存储局部变量 堆 存储new出来的东西 方法区 ...

  6. java中的内存分配原则

    问题:Java中这些类.变量.字符串.方法,在内存中是怎样分配的? 首先,Java中的内存区域如下: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是 ...

  7. 论 Java 中的内存分配

    ------------------------------------------------------------------------- Java内存分配主要包括以下几个区域: 1. 寄存器 ...

  8. 【java虚拟机序列】java中的垃圾回收与内存分配策略

    在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃 ...

  9. 【基础巩固篇】Java中String揭秘!

    作者:不清不慎,Java大数据开发工程师一枚,热爱研究开源技术! 架构师社区合伙人! String对象是我们日常使用的对象类型,字符串对象或者其等价对象(如char数组),在内存中总是占据了最大的空间 ...

最新文章

  1. C#反射(Reflection)详解
  2. ORM框架之------Dapper,Net下无敌的ORM
  3. vue 如何解析原生html,VUE渲染后端返回含有script标签的html字符串示例
  4. appium 环境搭建(不推荐安装此版本appium,推荐安装appium desktop)
  5. 【JEECG技术文档】JEECG 接口权限开发及配置使用说明
  6. cartographer编译过程遇到未定义的dlclose@@GLIBC_2.2.5
  7. Android 桌面组件【widget】初探
  8. atomsphere scattering almost final.
  9. Meshing Tutorials(网格划分教程)
  10. 简述c、c++和java三大语言特性
  11. 连续型随机变量及概率密度
  12. 【职场新贵】告诉你如何在压力下高效工作
  13. DevExpress之C#界面+MATLAB动态链接库联合编程
  14. 微信双开,手机如何开启微信分身?
  15. php 5.6.15漏洞,中国骇客云0day漏洞之蝉知 5.6 getshell
  16. 蔡康永的201堂情商课
  17. Django项目:CRM(客户关系管理系统)--69--59PerfectCRM实现king_admin行内编辑
  18. day-17正则表达式
  19. eda技术试卷_EDA技术课程试卷及答案
  20. php面向对象编写计算器,使用面向对象的图形计算器

热门文章

  1. 2017西安交大ACM小学期 文本查找[AC自动机]
  2. 等差区间 线段树+GCD
  3. 一文搞懂 Java 线程中断
  4. mybatis入门(三)之Mapper XML 文件
  5. Java类加载的那些事
  6. Shell入门(五)之参数
  7. js引擎执行代码的基本流程
  8. JS中函数和变量声明的提升
  9. 项目的包结构 mybatis三剑客
  10. java速学_5分钟快速入门Java,不看真的可惜了