Lombok使用2:常用注解

Stella981
• 阅读 695

本篇文章会讲到:@Setter,@Getter、@Getter(lazy=true)、@ToString、@EqualsAndHashCode、@NoArgsConstructor、@AllArgsConstructor、@RequiredArgsConstructor、@Data 注解使用

1、@Setter,@Getter使用

  • @Setter和@Getter官方文档地址

  • 注解在属性上,为属性提供 set()、 get() 方法 。

  • 注解在类上,为类所有的属性提供 set()、 get() 方法。

  • 所有非静态成员变量才会提供 set()、 get() 方法。

    import lombok.Getter; import lombok.Setter;

    @Setter @Getter public class Example {

    private String name;
    
    public String getName() {
        return name;
    }
    

    }

编译后:

public class Example {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

2、@Getter(lazy=true)

  • @Getter(lazy=true)官网文档地址

  • 标注用于生成一个 lazy 版的 getter,它会在第一次调用这个 getter 时计算一次值,然后从那里开始缓存它。如果计算该值需要大量 CPU,或者该值占用大内存,这可能很有用。Lombok 会自动去管理线程安全的问题,所以不会存在重复赋值的问题。

  • 要使用此功能,需要创建一个 private final 变量,并且使用运行成本高的表达式对其进行初始化,同时使用 @Getter(lazy=true) 注解进行标注。

    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; } }

编译后:

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;
  }
}

3、@ToString使用

  • @ToString官网文档地址

  • 该注解的作用是为类自动生成 toString() 方法。

  • 默认情况下,它会按顺序(以逗号分隔)打印这个类名称以及每个字段。 

  • 可以这样设置不包含哪些字段:@ToString(exclude = "id") 或者 @ToString(exclude = {"id","name"})

    import lombok.ToString;

    @ToString @Getter public class Example {

    private String name;
    
    private String age;
    

    }

 编译后:

public class Example {

    private String name;

    private String age;

    public String getName() {
        return name;
    }

    public String getAge() {
        return age;
    }

    @Override public String toString() {
        return "Example(name" + this.getName() + ", age=" + this.getAge() + ")";
    }

}

4、@EqualsAndHashCode使用

  • @EqualsAndHashCode官方文档地址
  • 为对象字段自动生成 hashCode() 和 equals() 实现。
  • 默认情况下,它将使用所有非静态,非 transient 字段。
  • 可以通过在可选的 exclude 参数中来排除更多字段。
  • 也可以通过在 parameter 参数中命名它们来准确指定希望使用哪些字段。

5、@NoArgsConstructor 使用

  • @NoArgsConstructor官方文档地址

  • 注解在类上,为类提供一个无参的构造方法。 

  • 当类中有 final 字段没有被初始化时,编译器会报错,此时可用 @NoArgsConstructor(force = true),然后就会为没有初始化的 final 字段设置默认值 0 / false / null。

  • 对于具有约束的字段(例如 @NonNull 字段),不会生成检查或分配,因此请注意,正确初始化这些字段之前,这些约束无效。

    import lombok.NoArgsConstructor;

    @NoArgsConstructor public class Example {

    private String name;
    
    private String age;
    

    }

编译后:

public class Example {

    private String name;

    private String age;

    public Example() {
    }
}

6、@AllArgsConstructor使用

  • @AllArgsConstructor官方文档地址

  • 注解在类上,为类提供一个全参的构造方法。

  • 默认生成的方法是 public 的,如果要修改方法修饰符可以设置 AccessLevel 的值。例如:@Getter(access = AccessLevel.PROTECTED)。

    import lombok.AllArgsConstructor;

    @AllArgsConstructor public class Example {

    private String name;
    
    private String age;
    

    }

编译后:

public class Example {

    private String name;

    private String age;

    public Example(String name, String age) {
        this.name = name;
        this.age = age;
    }
}

7、@RequiredArgsConstructor使用

  • @RequiredArgsConstructor官方文档地址

  • 注解在类上,会生成构造方法(可能带参数也可能不带参数)。如果带参数,这参数只能是以 final 修饰的未经初始化的字段或者是以 @NonNull 注解的未经初始化的字段。

  • 该注解还可以用 @RequiredArgsConstructor(staticName="methodName") 的形式生成一个指定名称的静态方法,返回一个调用相应的构造方法产生的对象。

    import lombok.RequiredArgsConstructor;

    @RequiredArgsConstructor public class Example {

    private final String name;
    
    private String age;
    

    }

编译后:

public class Example {

    private final String name;

    private String age;

    public Example(String name) {
        this.name = name;
    }
}

8、@Data使用

  • @Data官方文档地址

  • @Data 是一个复合注解,注解在类上,自动生成默认的无参构造函数、所有属性的 getter、所有非 final 属性的 setter 方法,并重写 toString、equals、hashcode 方法。

    @Data public class Example {

    private String name;
    
    private String age;
    

    }

等于为:

import lombok.*;

@Setter
@Getter
@ToString
@EqualsAndHashCode
@NoArgsConstructor
public class Example {

    private String name;

    private String age;

}

更多阅读

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
kenx kenx
3年前
个人博客开发之blog-api项目统一结果集api封装
前言由于返回jsonapi格式接口,所以我们需要通过javabean封装一个统一数据返回格式,便于和前端约定交互,状态码枚举ResultCodejavapackagecn.soboys.core.ret;importlombok.Getter;/@authorkenx@version1.0@date2021/6/1715:35
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
Java_map的key为自定义对象
首先自定义Key对象importlombok.AllArgsConstructor;importlombok.Getter;importlombok.Setter;importjava.util.Objects;/@authorAganRun
Stella981 Stella981
3年前
Idea插件lombok的安装和使用
  C在写一个实体类时,有属性的写法,省去了写getter和setter的麻烦。  在Java编程时,写完字段后,需要一个一个去写getter和setter方法。在使用Idea编程时,可以按住ALTINSERT键,让IDE自动生成getter,setter,toString等方法,如下图:!(https://static.oschina.
Stella981 Stella981
3年前
FastJson 反序列化注意事项
问题描述使用fastJson对json字符串进行反序列化时,有几个点需要注意一下:反序列化内部类反序列化模板类0\.Getter/Setter问题如我们希望返回的一个json串为"name":"name","isDeleted":true,"isEmpty":1
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这