Java中的惰性赋值

(想自学习编程的小伙伴请搜索圈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在这种特定情况下提供的抽象级别高一级。但了解实施可能是什么样子至关重要。如果您知道如何钓鱼,您可以购买包装好的鱼,因为这样您就可以知道鱼何时好吃。如果你不知道如何钓鱼,你会依赖那些给你鱼的人的怜悯。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值