主要讲解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相关的注解,我再总结一下。