Java中的延迟分配
程序员本来就是懒惰的,而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中的延迟分配相关推荐
- Java基础-Java中的内存分配与回收机制
Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二. 转载于:https://www.cnblogs.com/yinzhengji ...
- Java中的堆分配参数总结《对Java的分析总结》(二)
<对Java的分析总结>-Java中的堆分配参数总结 header 配制说明 -Xms: 设置Java应用程序启动时的初始堆大小 -Xmx: 设置Java应用程序能获得的最大堆大小 -Xs ...
- java中堆栈内存_Java堆空间与堆栈– Java中的内存分配
java中堆栈内存 Sometime back I wrote a couple of posts about Java Garbage Collection and Java is Pass by ...
- java中延迟_Java中的延迟分配
java中延迟 程序员本质上是懒惰的,而similis simili gaudet就像程序是懒惰的一样. 您听说过延迟加载吗? 还是懒惰的单身人士? (不过,我个人更喜欢单一麦芽版本.)如果使用Sca ...
- Java中的内存分配
Java 程序在运行时,需要在内存中的分配空间.为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式. 栈 存储局部变量 堆 存储new出来的东西 方法区 ...
- java中的内存分配原则
问题:Java中这些类.变量.字符串.方法,在内存中是怎样分配的? 首先,Java中的内存区域如下: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是 ...
- 论 Java 中的内存分配
------------------------------------------------------------------------- Java内存分配主要包括以下几个区域: 1. 寄存器 ...
- 【java虚拟机序列】java中的垃圾回收与内存分配策略
在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃 ...
- 【基础巩固篇】Java中String揭秘!
作者:不清不慎,Java大数据开发工程师一枚,热爱研究开源技术! 架构师社区合伙人! String对象是我们日常使用的对象类型,字符串对象或者其等价对象(如char数组),在内存中总是占据了最大的空间 ...
最新文章
- C#反射(Reflection)详解
- ORM框架之------Dapper,Net下无敌的ORM
- vue 如何解析原生html,VUE渲染后端返回含有script标签的html字符串示例
- appium 环境搭建(不推荐安装此版本appium,推荐安装appium desktop)
- 【JEECG技术文档】JEECG 接口权限开发及配置使用说明
- cartographer编译过程遇到未定义的dlclose@@GLIBC_2.2.5
- Android 桌面组件【widget】初探
- atomsphere scattering almost final.
- Meshing Tutorials(网格划分教程)
- 简述c、c++和java三大语言特性
- 连续型随机变量及概率密度
- 【职场新贵】告诉你如何在压力下高效工作
- DevExpress之C#界面+MATLAB动态链接库联合编程
- 微信双开,手机如何开启微信分身?
- php 5.6.15漏洞,中国骇客云0day漏洞之蝉知 5.6 getshell
- 蔡康永的201堂情商课
- Django项目:CRM(客户关系管理系统)--69--59PerfectCRM实现king_admin行内编辑
- day-17正则表达式
- eda技术试卷_EDA技术课程试卷及答案
- php面向对象编写计算器,使用面向对象的图形计算器