Lombok

简介

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

常用

  1. @Getter/@Setter
  2. @ToString
  3. @EqualsAndHashCode
  4. @NonNull
  5. @NoArgsConstructor,@RequiredArgsConstructor,@AllArgsConstruor
  6. @Data
  7. @Builder
  8. @Log
  9. val
  10. @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);
}