简述
lombok可以通过注解的方式,帮我们简化java类中诸如Getter,Setter,ToString等臃肿但是又必须的方法书写。
Lombok依赖
https://mvnrepository.com/artifact/org.projectlombok/lombok
这里使用lombok的1.18.22版本
dependencies { compileOnly 'org.projectlombok:lombok:1.18.22' }
注意如果gradle版本在5.0以上会构建失败,正确的姿势应该是:
dependencies { compileOnly 'org.projectlombok:lombok:1.18.22' annotationProcessor 'org.projectlombok:lombok:1.18.22' testCompileOnly 'org.projectlombok:lombok:1.18.22' testAnnotationProcessor 'org.projectlombok:lombok:1.18.22' }
原因详见https://cloud.tencent.com/developer/article/1480194
IDEA的lombok插件
Intellij IDEA 2020.3之后 Lombok 已经成为内置插件,不需要自行安装
以前版本可以在插件市场进行安装
在idea设置栏选中启用Annotation Processors
Lombok注解
常用注解
@Data | 最常用的注解,注解在类上,相当于同时使用了@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstrutor |
@Setter | 作用于属性上,为该属性提供setter方法; 作用与类上,为该类所有的属性提供setter方法 |
@Getter | 作用和Setter相似,生成Getter方法 |
@AllArgsConstructor | 作用于类上,为该类提供一个包含全部参的构造方法,注意此时默认构造方法不会提供。 |
@NoArgsConstructor | 作用于类上,提供一个无参的构造方法。可以和@AllArgsConstructor同时使用,此时会生成两个构造方法:无参构造方法和全参构造方法。 |
@NonNull | 作用于属性上,提供关于此参数的非空检查,如果参数为空,则抛出空指针异常。 |
@Log4j | 作用于类上,为该类提供一个属性名为log的log4j日志对象。 |
@Data
例如我在一个java上添置了@Data注解
package com.hjj; import lombok.Data; @Data public class Student { private String name; private Integer age; }
编译后可以看到生成了setter/getter、equals、canEqual、hashCode、toString方法
注意@Data注解没有生成带参构造函数,如果需要生成要用@AllArgsConstructor注解
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) // package com.hjj; public class Student { private String name; private Integer age; public Student() { } public String getName() { return this.name; } public Integer getAge() { return this.age; } public void setName(String name) { this.name = name; } public void setAge(Integer age) { this.age = age; } public boolean equals(Object o) { if (o == this) { return true; } else if (!(o instanceof Student)) { return false; } else { Student other = (Student)o; if (!other.canEqual(this)) { return false; } else { Object this$name = this.getName(); Object other$name = other.getName(); if (this$name == null) { if (other$name != null) { return false; } } else if (!this$name.equals(other$name)) { return false; } Object this$age = this.getAge(); Object other$age = other.getAge(); if (this$age == null) { if (other$age != null) { return false; } } else if (!this$age.equals(other$age)) { return false; } return true; } } } protected boolean canEqual(Object other) { return other instanceof Student; } public int hashCode() { int PRIME = true; int result = 1; Object $name = this.getName(); int result = result * 59 + ($name == null ? 43 : $name.hashCode()); Object $age = this.getAge(); result = result * 59 + ($age == null ? 43 : $age.hashCode()); return result; } public String toString() { String var10000 = this.getName(); return "Student(name=" + var10000 + ", age=" + this.getAge() + ")"; } }Student类编译后
@NonNull
非常好用,在参数上使用后,构造函数中如果传入null给此参数会报错
例如我在Student类的name参数加了@NonNull
package com.hjj; import lombok.Data; import lombok.NonNull; @Data public class Student { @NonNull private String name; private Integer age; }
编译后的构造函数则为
public Student(@NonNull String name) { if (name == null) { throw new NullPointerException("name is marked @NonNull but is null"); } else { this.name = name; } }
可以看到name参数做了判空处理
@Log4j
使用此注解需同样引入slf4j的依赖
@Log4j注解会生成一个log常量供我们使用
import lombok.Data; import lombok.extern.slf4j.Slf4j; @Data @Slf4j public class Student { private String name; private Integer age; }
生成的代码为
public class Student { private static final Logger log = LoggerFactory.getLogger(Student.class); ... }
References
https://cloud.tencent.com/developer/article/1480194
https://blog.csdn.net/ThinkWon/article/details/101392808
https://blog.csdn.net/cauchy6317/article/details/102567195
标签:return,name,age,详解,Student,lombok,public From: https://www.cnblogs.com/CNLayton/p/16812128.html