Loading...
墨滴

楼仔

2021/05/20  阅读:46  主题:橙心

【Java基础系列1】Lombok常用注解

主要讲解Lombok几个常用的基本注解的使用。

最近工作中看到很多这种注解,就统一梳理一下,看一下相关的注解有哪些,便于应用到项目中。

前言

Lombok是一款在java开发中简洁化代码十分有用的插件工具,lombok提供了很多注解,在编译时候生成java代码,代替了手工编写一些简单的代码,使程序员可以关注更重要的实现。

插件配置

在使用lombok插件的时候,还要进行添加lombok的Maven依赖,代码示例:

<!--lombok 注解-->
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.16.10</version>
</dependency>

@Data注解

在JavaBean或类JavaBean中使用,这个注解包含范围最广,它包含getter、setter、NoArgsConstructor、equals、canEqual、hashCode、toString注解,即当使用当前注解时,会自动生成包含的所有方法。

  • @getter注解:在JavaBean或类JavaBean中使用,使用此注解会生成对应的getter方法;
  • @setter注解:在JavaBean或类JavaBean中使用,使用此注解会生成对应的setter方法;
  • @NoArgsConstructor注解:在JavaBean或类JavaBean中使用,使用此注解会生成对应的无参构造方法;
  • @ToString注解:在JavaBean或类JavaBean中使用,使用此注解会自动重写对应的toStirng方法;
  • @EqualsAndHashCode注解:在JavaBean或类JavaBean中使用,使用此注解会自动重写对应的equals方法和hashCode方法;

@getter、@setter

可以为相应的属性自动生成Getter/Setter方法:

@Setter
@Getter
public class Test1 {
    private Integer id;
    private String name;
    private Integer age;
    public static void main(String args[]) {
        Test1 test = new Test1();
        test.setId(1);
        test.setAge(18);
        test.setName("楼仔");
        System.out.println("id:" + test.getId());
        System.out.println("name:" + test.getName());
        System.out.println("age:" + test.getAge());
    }
}

// 输出:
// id:1
// name:楼仔
// age:18

@toString

会生成一个toString()方法,默认情况下,会输出类名、所有属性(会按照属性定义顺序),用逗号来分割。

@Setter
@Getter
@ToString
public class Test1 {
    private Integer id;
    private String name;
    private Integer age;
    public static void main(String args[]) {
        Test1 test = new Test1();
        test.setId(1);
        test.setAge(18);
        test.setName("楼仔");
        System.out.println("toString:" + test.toString());
    }
}
// 输出:
// toString:Test1(id=1, name=楼仔, age=18)

@EqualsAndHashCode

使用此注解会自动重写对应的equals方法和hashCode方法。

@Setter
@EqualsAndHashCode
public class Test1 {
    private Integer id;
    private String name;
    private Integer age;
    public static void main(String args[]) {
        Test1 test = new Test1();
        Test1 test1 = test;
        Test1 test2 = new Test1();
        System.out.println("test equals test1:" + test.equals(test1));
        System.out.println("test equals test2:" + test.equals(test2));
        System.out.println("hashCode test:" + test.hashCode());
        System.out.println("hashCode test1:" + test1.hashCode());
        System.out.println("hashCode test2:" + test2.hashCode());
    }
}
// 输出:
// test equals test1:true
// test equals test2:true
// hashCode test:357642
// hashCode test1:357642
// hashCode test2:357642

@Data

当使用@Data时,会包含getter、setter、NoArgsConstructor、equals、canEqual、hashCode、toString这些注解。

@Data
public class Test2 {
    private Integer id;
    private String name;
    private Integer age;
    public static void main(String args[]) {
        Test2 test = new Test2();
        test.setId(1);
        test.setAge(18);
        test.setName("楼仔");
        System.out.println("id:" + test.getId());
        System.out.println("name:" + test.getName());
        System.out.println("age:" + test.getAge());
        System.out.println("toString:" + test.toString());

        Test2 test1 = test;
        Test2 test2 = new Test2();
        System.out.println("test equals test1:" + test.equals(test1));
        System.out.println("test equals test2:" + test.equals(test2));
        System.out.println("hashCode test:" + test.hashCode());
        System.out.println("hashCode test1:" + test1.hashCode());
        System.out.println("hashCode test2:" + test2.hashCode());
    }
}
// 输出:
// id:1
// name:楼仔
// age:18
// toString:Test2(id=1, name=楼仔, age=18)
// test equals test1:true
// test equals test2:false
// hashCode test:50789814
// hashCode test1:50789814
// hashCode test2:357642

其它常用注解

@NoArgsConstructor

@NoArgsConstructor在类上使用,它可以提供一个无参构造器,比如:

@NoArgsConstructor
public class Test3 {
    private String name;
    private Integer age;
}
// 编译后:
public class Test3 {
    private String name;
    private Integer age;
    public Test3() {}
}

当然,有时候我们会使用到单例模式,这个时候我们需要将构造器私有化,那么就可以使用这样一个属性access设置构造器的权限:

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class Test3 {
    private String name;
    private Integer age;
}
// 编译后:
public class Test3 {
    private String name;
    private Integer age;
    private Test3() {}
}

当类中有final字段没有被初始化时,编译器会报错:

可用@NoArgsConstructor(force = true),那么Lombok就会为没有初始化的final字段设置默认值 0 / false / null, 这样编译器就不会报错:

@RequiredArgsConstructor

这个注解可以生成带参或者不带参的构造方法。若带参数,只能是类中所有带有 @NonNull注解的和以final修饰的未经初始化的字段,如下所示:

@RequiredArgsConstructor
@ToString
public class Test4 {
    private Integer id;
    private final String name;
    @NonNull
    private Integer age;

    public static void main(String args[]) {
        Test4 test = new Test4("楼仔"18);
        System.out.println("toString:" + test.toString());
    }
}
// 输出:
// toString:Test4(id=null, name=楼仔, age=18)

@AllArgsConstructor

该注解提供一个全参数的构造方法,默认不提供无参构造。需要注意的是,这里的全参不包括已初始化的final字段(主要是final字段,一旦被赋值不允许再被修改)。

@AllArgsConstructor
@ToString
public class Test5 {
    private Integer id;
    private final String name = "楼仔";
    private Integer age;

    public static void main(String args[]) {
        Test5 test = new Test5(1,18);
        System.out.println("toString:" + test.toString());
    }
}
// 输出:
// toString:Test5(id=1, name=楼仔, age=18)

@Builder

这个是我最近使用注解时,最喜欢的一个注解,保证让你用完一次后,就会爱上她!之前在文章《设计模式系列3-builder模式》讲解过这种设计模式,现在直接一个@Builder注解就能搞定,直接上代码:

@Builder
@Data
public class Test6 {
    private Integer id;
    private String name;
    private Integer age;
    public static void main(String args[]) {
        Test6 test = Test6.builder().
                id(1).
                name("楼仔").
                age(18).build();
        System.out.println("toString:" + test.toString());
    }
}
// 输出:
// toString:Test6(id=1, name=楼仔, age=18)

一个字,爽~~~

后记

对于Lombok,常用的注解可能还有一些,但是上面梳理的这些注解,是我近1-2周经常遇到的,如果后还有使用频率比较高的Lombok相关的注解,我再总结一下。

欢迎大家多多点赞,更多文章,请关注微信公众号“楼仔进阶之路”,点关注,不迷路~~

楼仔

2021/05/20  阅读:46  主题:橙心

作者介绍

楼仔