主要讲解Lombok几个常用的基本注解的使用。
最近工作中看到很多这种注解,就统一梳理一下,看一下相关的注解有哪些,便于应用到项目中。
往期精选(欢迎转发~~)
如何看待程序员35岁职业危机?
Java全套学习资料(14W字),耗时半年整理
我肝了三个月,为你写出了GO核心手册
消息队列:从选型到原理,一文带你全部掌握
肝了一个月的ETCD,从Raft原理到实践
更多...
Lombok是一款在java开发中简洁化代码十分有用的插件工具,lombok提供了很多注解,在编译时候生成java代码,代替了手工编写一些简单的代码,使程序员可以关注更重要的实现。
在使用lombok插件的时候,还要进行添加lombok的Maven依赖,代码示例:
org.projectlombok
lombok
1.16.10
在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方法:
@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()方法,默认情况下,会输出类名、所有属性(会按照属性定义顺序),用逗号来分割。
@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)
使用此注解会自动重写对应的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时,会包含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
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, 这样编译器就不会报错:
这个注解可以生成带参或者不带参的构造方法。若带参数,只能是类中所有带有 @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)
该注解提供一个全参数的构造方法,默认不提供无参构造。需要注意的是,这里的全参不包括已初始化的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)
这个是我最近使用注解时,最喜欢的一个注解,保证让你用完一次后,就会爱上她!之前在文章《设计模式系列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相关的注解,我再总结一下。