Java中的惰性赋值

    xiaoxiao2022-07-04  153

    (想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程等待你来学习。完全免费哦! )

    程序员本身就是懒惰和similis simili gaudet,也就像程序懒惰时一样。你有没有听过懒人装?还是懒惰的单身人士?(我个人而言,更喜欢单一麦芽版本。)如果您使用Scala或Kotlin进行编程,您甚至可以以懒惰的方式评估表达式。

    如果您使用Scala编程,则可以编写:

    懒 VAL ž = “你好”

    并且只有z在第一次访问时才会计算表达式。如果你在Kotlin编程,你可以这样写:

    VAL ž:字符串 由 懒 { “你好” }

    并且只有z在第一次访问时才会计算表达式。

    Java不支持懒惰的评估本身,但作为一种强大的语言,它提供了可用于获得相同结果的语言元素。当Scala和Kotlin为您提供鱼类时,Java会教您捕捉自己的鱼。(让我们在这个想法中加上一针。)

    当你在Scala和/或Kotlin中编写上面的代码时,背景中真正发生的是表达式没有被计算,变量不会保存表达式的结果。相反,这些语言会创建一些虚拟的“lambda”表达式,一个“供应商”,稍后将用于计算表达式的值。

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

    公共 类 Lazy 实现 供应商 { 最终的 私人 供应 商 ; private boolean supplied = false ; 私人 T 值 ; private Lazy(供应 商供应商){ 这个。供应商 = 供应商 ; } public static Lazy let(供应 商供应商){ return new Lazy(供应商); } @覆盖 public T get(){ if(提供){ 回报 值 ; } 供应 = 真 ; 返回 值 = 供应商。get(); } }

    的类有public static方法let()可用于定义一个供应商,并且该供应商被调用所述第一时间的方法get()被调用。使用此类,您可以将上面的示例编写为

    var z = 懒惰。let(()- > “你好”);

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

    com。javax0 lazylet 1.0。0

    然后,您不需要将代码复制到项目中。这是一个微型库,它只包含这个带有内部类的类,Lazy可以在多线程环境中使用。

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

    私有 静态 类 TestSupport { int count = 0 ; boolean callMe(){ count ++ ; 返回 true ; } } ... final var ts = new TestSupport(); var z = 懒惰。let(ts :: callMe); 如果(假 && ž。获得()){ 断言。失败(); } 断言。的assertEquals(0,TS。计数); z。get(); 断言。的assertEquals(1,TS。计数); z。get(); 断言。的assertEquals(1,TS。计数);

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

    final var ts = new TestSupport(); var z = 懒惰。sync(ts :: callMe); 如果(假 && ž。获得()){ 断言。失败(); } 断言。的assertEquals(0,TS。计数); z。get(); 断言。的assertEquals(1,TS。计数); z。get(); 断言。的assertEquals(1,TS。计数);

    然后,您将获得Lazy可供多个线程使用的供应商,并且仍然保证供应商作为参数传递仅传递一次。

    给你一条鱼或教你钓鱼

    我说要在说明中放一个别针:“当Scala和Kotlin给你鱼时,Java教你捕捉自己的鱼。”这就是我的意思。

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

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

    最新回复(0)