Lombok

简述:lombok是java类库,会利用注解自动生成相应的操作,使代码更加简洁,美观。

  • @Data
    他相当于@ToString,@EqualAndHashCode,@Getter/@Setter 和@RequiredArgsConstructor绑定在一起的效果。但是其无法为这些注解设置参数,例如callSuper,includeFieldNames和exclude,如果需要为这些注解设置参数,只需显示添加即可。
@Data
public class DataExample {

    private final String name;

    @Setter(AccessLevel.PACKAGE)
    private int age;

    private double score;

    private String[] tags;

    @ToString(includeFieldNames = true)
    @Data(staticConstructor = "of")
    public static class Exercise<T> {
        private final String name;
        private final T value;
    }

}
  • @NonNull
    你可以使用 @NonNull 对方法或者构造器生成 null - check

  • @Getter & @Setter
    除非你指定AccessLevel 访问级别,否则使用 Getter / Setter 生成的方法默认是 public 的作用范围。AccessLevel的访问级别有 PUBLIC, PROTECTED, PACKAGE, and PRIVATE.
    你也可以在类上使用 @Getter / @Setter ,在这种情况下,就会对该类中的所有非静态属性生成 get and set 方法
    你也可以通过设置 AccessLevel.NONE 禁用任何 get and set 方法的生成。这会使 @Data、@Getter / @Setter 的注解失效。

  • @ToString
    通过设置 includeFieldNames = true(默认) 能够使 toString() 方法打印每个字段的属性值和名称。默认情况下,所有非静态属性都被打印,如果你想要排除某些字段的话,需要设置 @ToString.Exclude,或者,你可以指定ToString(onlyExplicitlyIncluded = true)来指定哪些你希望使用的字段。然后使用@ ToString.Include标记要包含的每个字段。
    通过设置 callSuper 为 true ,可以将toString的超类实现的输出包含到输出中。
    你还可以在toString 中包含方法调用的输出。只能包含不带参数的实例(非静态)方法,为此,请使用@ ToString.Include标记方法。
    你可以使用 @ToString.Include(name =“some other name”)更改用于标识成员的名称,并且可以通过 @ ToString.Include(rank = -1)更改成员的打印顺序。没有定义等级的成员默认是0级,等级高的成员优先被打印,优先级相同的成员按照它们在源文件中出现的顺序打印

  • @EqualsAndHashCode
    任何类的定义都可以用@EqualsAndHashCode 标注,让 lombok 为其生成 equals和 hashCode 方法。默认情况下,将会用在非静态,非 transient 标记的字段上,但是你可以通过 @EqualsAndHashCode.Include或 @EqualsAndHashCode.Exclude 标记类型成员来修改使用哪些字段。或者,你可以通过使用 @EqualsAndHashCode.Include 并使用 @EqualsAndHashCode(onlyExplicitlyIncluded = true)标记它们来准确指定你希望使用的字段或方法。如果将 @EqualsAndHashCode 应用于扩展另一个的类,这个特性就会变的很危险。通常来说,对类自动生成equals 和 hashcode 方法不是一个好的选择,因为超类也定义了字段,这些字段也需要equals / hashCode方法。通过设置 callSuper 为 true,可以在生成的方法中包含超类的 equals 和 hachcode 方法。
    对于 hashCode 来说,super.hashCode 的结果包括了哈希算法,对于 equals 来说,如果超类实现认为它不等于传入的对象,生成的方法将返回 false。请注意,不是所有的equals 实现都能正确处理这种情况。然而,lombok生成的 equals实现可以正确处理这种情况。
    没有扩展除object父类的类,不要设置callSuper,否则会报错
    当你继承其他类时没有设置 callSuper 为 true 会进行警告,因为除非父类没有相同的属性,lombok无法为您生成考虑超类声明的字段的实现。你需要自己写实现类或者依赖 callSuper 工具。你还可以使用 lombok.equalsAndHashCode.callSuper 配置key。

  • @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
    @NoArgsConstructor 将会生成无参数的构造函数,如果有final 修饰的字段并且没有为 final 修饰的字段进行初始化的话,那么单纯的使用 @NoArgsConstructor 注解会提示编译错误。修改建议:需要为 @NoArgsConstructor 指定一个属性@NoArgsConstructor(force=true),lombok会为上面的final 字段默认添加初始值。此注解主要与 @Data 或生成注解的其他构造函数组合使用。
    这里有个需要注意的地方:@NonNull 不要和 @NoArgsConstructor 一起使用。
    @RequiredArgsConstructor 将为每个需要特殊处理的字段生成一个带有1个参数的构造函数。所有未初始化的 final 字段都会获取一个参数,以及标记为 @NonNull 的任何字段也会获取一个参数。这些字段在声明它们的地方没有初始化。对于这些标记为 @NonNull 的字段,会生成特殊的null 编译检查。如果标记为 @NonNull 的字段的参数为 null,那么构造函数将会抛出 NullPointerException。参数的顺序与字段在类中的显示顺序相匹配。
    @AllArgsConstructor: 为类中的每个字段生成一个带有1个参数的构造函数。标有@NonNull 的字段会导致对这些参数进行空检查。

    这些注解中的每一个都允许使用替代形式,其中生成的构造函数始终是私有的,并且生成包含私有构造函数的附加静态工厂方法,通过为注释提供staticName值来启用此模式,@RequiredArgsConstructor(staticName =“off”)

插件都存在一定的侵入性,但是通过该方式可以很方便的字段修改

  • @Value
    @Value 是 @Data 中不可变的注解,所有的属性默认都是 private 和 final 的,并且不会生成 setters 方法。默认情况下,类也是 final 的。像是 @Data ,会生成 toString() ,也会生成 equals() 和 hashCode() 方法,每个字段都会获得一个 getter 方法,并且还会生成一个覆盖每个参数的构造函数(在字段声明中初始化final 段除外)。
    在实际使用过程中,@ Value是简写:final @ToString @EqualsAndHashCode @AllArgsConstructor @FieldDefaults(makeFinal = true,level = AccessLevel.PRIVATE)@Getter,除了明确包括任何相关方法的实现外,只意味着不会发出警告。

  • @Synchronized
    @Synchronized 是 synchronized 修饰方法的一个安全的变体。就像 synchronized,这个注解仅仅能够用在静态和实例方法上。它的操作类似于 synchronized 关键字,但它锁定在不同的对象上。如果你把此注解放在了一个私有属性上面,它会为你自动锁定 $lock 对象,如果没有这个属性,它将为你自动创建。如果你把此注解放在了静态方法上面,它将为你自动锁定 L O C K 对 象 你 可 以 创 建 自 己 的 锁 , 如 果 你 已 经 自 己 创 建 了 LOCK对象 你可以创建自己的锁,如果你已经自己创建了 LOCK lock和$ LOCK字段,那么它们当然不会生成。你还可以选择锁住其他字段,方法是将其指定为@Synchronized注解的参数,在此用法的变体中,不会自动创建字段,你必须自己显式创建它们,否则将会抛出错误。
    锁定这个或你自己的类对象会产生其他影响,因为不受你控制的其他代码也可以锁定这些对象,这可能会导致竞争条件和其他线程错误。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值