文章目录
简介
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.通过注解帮助开发人员消除Java中的冗长代码(简单的Java对象)
原理
JSR 269:插件化注解处理API
javac编译阶段给被注解的类加上对应的方法
安装
使用
javac
- 拷贝jar到类路径
- javac -cp lombok.jar [待编译的包]
Maven
引入依赖
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>compile</scope> </dependency>
Intelllij IDEA
- 安装Lombok插件
- Go to
File>Settins>Plugins
- Clik on
Browse repositories
- Seach for
Lombok Plugin
- Clik on
Install plugin
- Restart Intellij IDEA
常用
- @Getter/@Setter
- @ToString
- @EqualsAndHashCode
- @NonNull
- @NoArgsConstructor,@RequiredArgsConstructor,@AllArgsConstruor
- @Data
- @Builder
- @Log
- val
- @Cleanup
@Getter、@Setter
可以用于类和成员变量上
@Getter //public,默认值
@Getter(AccessLeavel.PUBLIC) //public
@Getter(AccessLeavel.PROTECTED) //protected
@Getter(AccessLeavel.NONE) //不生成Getter方法@Setter //public,默认值
//对被static修饰的变量不产生效果
//对被final修饰的变量只产生getter方法,不产生setter方法
@Getter
@Setter
public class User {
private String userName;
private Integer age;
}
//编译后
public class User {
private String userName;
private Integer age;
public User() {
}
public String getUserName() {
return this.userName;
}
public Integer getAge() {
return this.age;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setAge(Integer age) {
this.age = age;
}
}
@Getter(AccessLevel.PRIVATE)
@Setter(AccessLevel.PROTECTED)
public class User {
@Getter(AccessLevel.NONE)
private String userName;
@Setter(AccessLevel.NONE)
private Integer age;
}
//编译后
public class User {
private String userName;
private Integer age;
public User() {
}
private Integer getAge() {
return this.age;
}
protected void setUserName(String userName) {
this.userName = userName;
}
}
@Getter
@Setter(AccessLevel.PUBLIC)
public class User {
private final String userName="";
private static Integer age;
}
//编译后
public class User {
private final String userName = "";
private static Integer age;
public User() {
}
public String getUserName() {
this.getClass();
return "";
}
}
@ToString
//仅支持添加到类上
@ToString //默认不排除任何字段
@ToString(exclude={"email","password"}) //排除email和password
@ToString(of={"userName","age"}); //只输出userName和password字段
@ToString
public class User {
private String userName;
private Integer age;
}
//编译后
public class User {
private String userName;
private Integer age;
public User() {
}
public String toString() {
return "User(userName=" + this.userName + ", age=" + this.age + ")";
}
}
@ToString(of = {"userName"},exclude = {"userName"})
public class User {
private String userName;
private Integer age;
}
//编译后
public class User {
private String userName;
private Integer age;
public User() {
}
public String toString() {
return "User(userName=" + this.userName + ")";
}
}
@EqualsAndHashCode
boolean equals(Object); //判断对象是否相等
boolean canEqual(Object); //判断对象是不是该类的一个实例
int hashCode(); //计算对象的hash值
@EqualsAndHashCode(excelude={"phone","password"}) //排除phone、password字段
@EqualsAndHashCode(of={"userName","passwd"}) //仅判断userName与passwd属性
@EqualsAndHashCode
public class User {
private String userName;
private Integer age;
}
//编译后
public class User {
private String userName;
private Integer age;
public User() {
}
public boolean equals(Object o) {
if (o == this) {
return true;
} else if (!(o instanceof User)) {
return false;
} else {
User other = (User)o;
if (!other.canEqual(this)) {
return false;
} else {
Object this$userName = this.userName;
Object other$userName = other.userName;
if (this$userName == null) {
if (other$userName != null) {
return false;
}
} else if (!this$userName.equals(other$userName)) {
return false;
}
Object this$age = this.age;
Object other$age = other.age;
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 User;
}
public int hashCode() {
int PRIME = true;
int result = 1;
Object $userName = this.userName;
result = result * 59 + ($userName == null ? 43 : $userName.hashCode());
Object $age = this.age;
result = result * 59 + ($age == null ? 43 : $age.hashCode());
return result;
}
}
@NonNull
//可以用于实参与属性值
public void test(@NonNll String s){
//方法体
}
//test()编译后
public void testj(@NonNull String s){
if(s==null){
throw new NullPonintException("s is marked non-null but is null");
}else{
//方法体
}
}
//调用时
mian(){
test(null); //当传入的值为空时,会报出异常
}
@NonNull
private String id; //调用时若id为空,会抛出异常
@NoArgsConstructor、@RequiredArgsConstructor、@AllArgsConstructor
@NoArgsConstructor //无参构造器
@RequiredArgsConstructor //自定义构造器,生成带有标记为@NonNull和无初始值的final的属性的构造器
@AllArgsConstructor //带有所有属性的构造器
@DATA
/*
集成了以下4个注解
@Getter/@Setter
@ToString
@EqualsAndHashCode
@RequiredArgsConstructor
*/
@Data
public class User {
private String userName;
private Integer age;
}
//编译后
public class User {
private String userName;
private Integer age;
public User() {
}
public String getUserName() {
return this.userName;
}
public Integer getAge() {
return this.age;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setAge(Integer age) {
this.age = age;
}
public boolean equals(Object o) {
if (o == this) {
return true;
} else if (!(o instanceof User)) {
return false;
} else {
User other = (User)o;
if (!other.canEqual(this)) {
return false;
} else {
Object this$userName = this.getUserName();
Object other$userName = other.getUserName();
if (this$userName == null) {
if (other$userName != null) {
return false;
}
} else if (!this$userName.equals(other$userName)) {
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 User;
}
public int hashCode() {
int PRIME = true;
int result = 1;
Object $userName = this.getUserName();
result = result * 59 + ($userName == null ? 43 : $userName.hashCode());
Object $age = this.getAge();
result = result * 59 + ($age == null ? 43 : $age.hashCode());
return result;
}
public String toString() {
return "User(userName=" + this.getUserName() + ", age=" + this.getAge() + ")";
}
}
@Builder
//生成一个内部类
public class User{
UserBuilder(){
final String userName;
final int age;
UserBuilder(); //无参构造
UserBuilder userName(String userName) //设置userName的值
UserBuilder age(int age) //设置age
}
private String userName;
private int age;
UserBuilder builder()
}
//调用,链式编程
main(){
User user = User.bulder().userName("joey").age(18).build();
}
@Builder
public class User {
private String userName;
private Integer age;
}
//编译后
public class User {
private String userName;
private Integer age;
User(String userName, Integer age) {
this.userName = userName;
this.age = age;
}
public static UserBuilder builder() {
return new UserBuilder();
}
public static class UserBuilder {
private String userName;
private Integer age;
UserBuilder() {
}
public UserBuilder userName(String userName) {
this.userName = userName;
return this;
}
public UserBuilder age(Integer age) {
this.age = age;
return this;
}
public User build() {
return new User(this.userName, this.age);
}
public String toString() {
return "User.UserBuilder(userName=" + this.userName + ", age=" + this.age + ")";
}
}
}
@Log
@Log
//调用log.info(Stirng)//
val
val map = new HashMap<String,String>();
//map不限制类型,在编译时确定map的类
@Cleanup
//使用Cleanup之前
InputStream in = null;
OutputStream out = null;
try{
in = new FileInputStream("filepath");
out = new FileoutputStream("path");
byte[] b = new byte[1000];
while(true){
int r = in.read(b);
if(r == -1) break;
out.write(b,0,r);
}
}finally{
if(in != null){
in.close();
}
if(out != null){
out.close();
}
}
//使用@Cleanup后
//可以省去关闭流的操作
@Cleanup InputStream in = new FileInputStream("filepath");
@Cleanup OutputStream out = new FileOutputStream("path");
//省去try-cath-finally等操作
byte[] b = new byte[1000];
while(true){
int r = in.read(b);
if(r == -1) break;
out.write(b,0,r);
}