Lombok
文章目录
- 简介
- 原理
- 安装
- 常用
- @Getter、@Setter
- @ToString
- @EqualsAndHashCode
- @NonNull
- @NoArgsConstructor、@RequiredArgsConstructor、@AllArgsConstructor
- @DATA
- @Builder
- @Log
- val
- @Cleanup
简介
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);
}