美文网首页
@Getter(lazy=true)

@Getter(lazy=true)

作者: eagle_king | 来源:发表于2019-01-14 10:31 被阅读0次

@Getter(lazy=true)

懒惰是一种美德!
@Getter(lazy=true) 在Lombok v0.10中引入。

Overview

你可以让lombok生成一个getter,它会在第一次调用这个getter时计算一次值,然后从那里开始缓存它。如果计算该值需要大量CPU,或者该值占用大量内存,这可能很有用。要使用此功能,请创建一个private final变量,使用运行成本高的表达式对其进行初始化,并使用@Getter(lazy=true)。该字段将从其余代码中隐藏,并且在首次调用getter时,表达式将被评估不超过一次。没有魔术标记值(即使你的计算结果昂贵null,结果是缓存的),而且昂贵的计算不需要是线程安全的,因为lombok负责锁定。

如果初始化表达式很复杂或包含泛型,我们建议将代码移动到私有(如果可能的静态)方法,并调用它。

With Lombok

import lombok.Getter;

public class GetterLazyExample {
  @Getter(lazy=true) private final double[] cached = expensive();
  
  private double[] expensive() {
    double[] result = new double[1000000];
    for (int i = 0; i < result.length; i++) {
      result[i] = Math.asin(i);
    }
    return result;
  }
}

Vanilla Java

public class GetterLazyExample {
  private final java.util.concurrent.AtomicReference<java.lang.Object> cached = new java.util.concurrent.AtomicReference<java.lang.Object>();
  
  public double[] getCached() {
    java.lang.Object value = this.cached.get();
    if (value == null) {
      synchronized(this.cached) {
        value = this.cached.get();
        if (value == null) {
          final double[] actualValue = expensive();
          value = actualValue == null ? this.cached : actualValue;
          this.cached.set(value);
        }
      }
    }
    return (double[])(value == this.cached ? null : value);
  }
  
  private double[] expensive() {
    double[] result = new double[1000000];
    for (int i = 0; i < result.length; i++) {
      result[i] = Math.asin(i);
    }
    return result;
  }
}

Supported configuration keys:

lombok.getter.lazy.flagUsage = [warning | error] (default: not set)

Small print

你永远不应该直接引用这个字段,总是使用lombok生成的getter,因为字段的类型会被破坏成一个AtomicReference。不要试图直接访问它AtomicReference; 如果它指向自己,那么该值已经计算出来了null。如果参考指向null,则表示该值尚未计算。在将来的版本中,此行为可能会更改 因此,始终使用生成的getter访问您的字段!

其他Lombok注释,@ToString即使你使用也总是调用getter doNotUseGetters=true。

相关文章

  • @Getter(lazy=true)

    @Getter(lazy=true) 懒惰是一种美德!@Getter(lazy=true) 在Lombok v0....

  • lombok @Getter(lazy=true)

    @Getter(lazy=true) 该标注用于生成一个 lazy 版的 getter,它会在第一次调用这个 ge...

  • lombok 文档翻译

    @Getter 可选元素: 使用示例: 说明: Lazy:默认为:false,如果设置 lazy 则 该属性必须为...

  • 延迟检索与立即检索

    检索方式检索概念与检索配置lazy="true"1.缺省延时装载为lazy=”true”.延迟到真正使用对象非主键...

  • echarts-解决数据改变图表仅部分更新的问题

    设置notMerge属性为true charts.setOption(option, notMerge, lazy...

  • Sping中bean的延迟加载

    Srping中的延迟加载使用@Lazy注解或把 中的lazy-init属性设置为true就可以了。之前只了解这么多...

  • swift 中的 Lazy

    前言 lazy,延迟加载,以前只知道延迟属性,这个和 OC 中很多时候重写 getter 方法类似,只是今天看到 ...

  • Swift:)懒加载Lazy

    OC中,要实现懒加载是用到getter方法,例如 Swift懒加载差别就很大了,懒加载属性用lazy修饰,注意结尾...

  • Swift中懒加载

    在Swift中对控件进行懒加载比oc中方便很多,只要lazy前缀,oc中懒加载方法,重写getter方法.Swif...

  • 第三章 3.3其他知识点

    3.3.1 延迟初始化bean 使用时才加载:配置文件用 lazy-init="true" 进行配置 3.3....

网友评论

      本文标题:@Getter(lazy=true)

      本文链接:https://www.haomeiwen.com/subject/qqkddqtx.html