美文网首页
lombok的使用

lombok的使用

作者: chushiyan | 来源:发表于2019-12-31 21:44 被阅读0次

    一、lombok是什么

      java中的javabean需要添加相应的getter/setter,即使idea等都提供了自动生成的功能,但是一旦需要修改,哪怕只是修改一个属性的类型、变量名,都得先删除原先的、再重新自动生成。Lombok就是来解决这个麻烦的。
      Lombok通过注解的方式,在编译时自动为属性生成构造函数、getter/setter、equals()、hashcode()、toString()方法。虽然源码中没有getter/setter等方法,但是在编译生成的字节码文件中却有这些方法。

    二、lombok的基本使用

    1、idea中安装lombok插件

    打开idea的settings,点击Plugins,在搜索框中输入lombok进行搜索安装即可。

    2、在springboot的项目加入依赖

    <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
    </dependency>
    

    3、javabean上加上注解

    import lombok.Data;
    
    import java.io.Serializable;
    
    /**
     * @author chushiyan
     * @email Y2h1c2hpeWFuMDQxNUAxNjMuY29t(base64)
     * @description
     */
     
    // 加上Data注解,编译时会自动生成setter/getter/equals/canEqual/hashCode/toString方法,如为final属性,则不会为该属性生成setter方法。
    @Data 
    public class User implements Serializable {
    
        private String id;
    
        private String name;
    
        private String password;
    }
    

    三、lombok常用注解

    注解 说明
    1 @Data 注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
    2 @Slf4j 类级别注解,生成log常量。
    加上这个注解,会在编译时生成如下的常量声明
    private static final Logger log = LoggerFactory.getLogger(AdminController.class);
    就不用自己声明log,就可以直接在代码中使用log
    3 @Setter 注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。
    4 @Getter 使用方法同Setter,区别在于生成的是getter方法。
    5 @ToString 注解在类,添加toString方法。
    6 @EqualsAndHashCode 注解在类,生成hashCode和equals方法。
    7 @NoArgsConstructor 注解在类,生成无参的构造方法。
    8 @RequiredArgsConstructor 注解在类,为类中需要特殊处理的字段生成构造方法,比如final和被@NonNull注解的字段。
    9 @AllArgsConstructor 注解在类,生成包含类中所有字段的构造方法。

    四、其他

    (一)Data注解帮我们生成了哪些方法?

    1、源码中加上Data注解

    package org.chushiyan.em.pojo;
    
    import lombok.Data;
    
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    import java.io.Serializable;
    
    /**
     * @author chushiyan
     * @email Y2h1c2hpeWFuMDQxNUAxNjMuY29t(base64)
     * @description
     */
    @Data
    public class User implements Serializable {
    
        private String id;
    
        @NotNull(message = "姓名不能为空")
        @Size(min = 2, max = 20, message = "姓名长度必须在2-20之间")
        private String name;
    
    
        @NotNull(message = "密码不能为空")
        @Size(min = 6, max = 60, message = "密码长度必须在6-60之间")
        private String password;
    }
    

    2、根据生成的class反编译后的代码

    这里使用的Java Decompiler反编译工具,下载使用详见官网:Java Decompiler

    package org.chushiyan.em.pojo;
    
    import java.io.Serializable;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    
    public class User implements Serializable {
      private String id;
      
      @NotNull(message = ")
      @Size(min = 2, max = 20, message = ")
      private String name;
      
      @NotNull(message = ")
      @Size(min = 6, max = 60, message = ")
      private String password;
      
      public void setId(String id) {
        this.id = id;
      }
      
      public void setName(String name) {
        this.name = name;
      }
      
      public void setPassword(String password) {
        this.password = password;
      }
      
      public boolean equals(Object o) {
        if (o == this)
          return true; 
        if (!(o instanceof User))
          return false; 
        User other = (User)o;
        if (!other.canEqual(this))
          return false; 
        Object this$id = getId(), other$id = other.getId();
        if ((this$id == null) ? (other$id != null) : !this$id.equals(other$id))
          return false; 
        Object this$name = getName(), other$name = other.getName();
        if ((this$name == null) ? (other$name != null) : !this$name.equals(other$name))
          return false; 
        Object this$password = getPassword(), other$password = other.getPassword();
        return !((this$password == null) ? (other$password != null) : !this$password.equals(other$password));
      }
      
      protected boolean canEqual(Object other) {
        return other instanceof User;
      }
      
      public int hashCode() {
        int PRIME = 59;
        result = 1;
        Object $id = getId();
        result = result * 59 + (($id == null) ? 43 : $id.hashCode());
        Object $name = getName();
        result = result * 59 + (($name == null) ? 43 : $name.hashCode());
        Object $password = getPassword();
        return result * 59 + (($password == null) ? 43 : $password.hashCode());
      }
      
      public String toString() {
        return "User(id=" + getId() + ", name=" + getName() + ", password=" + getPassword() + ")";
      }
      
      public String getId() {
        return this.id;
      }
      
      public String getName() {
        return this.name;
      }
      
      public String getPassword() {
        return this.password;
      }
    }
    
    

    说明Data注解会为类的属性自动生成setter/getter、equals、canEqual、hashCode、toString方法。

    (二)我们自己编写的toString()等方法会被lombok覆盖掉吗

    1、源码

    自己编写(或者使用idea自动生成)equals()/hashCode()/toString()

    package org.chushiyan.em.pojo;
    
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    import java.io.Serializable;
    
    /**
     * @author chushiyan
     * @email Y2h1c2hpeWFuMDQxNUAxNjMuY29t(base64)
     * @description
     */
    @Data
    @NoArgsConstructor
    public class User implements Serializable {
    
        private String id;
    
        @NotNull(message = "姓名不能为空")
        @Size(min = 2, max = 20, message = "姓名长度必须在2-20之间")
        private String name;
    
    
        @NotNull(message = "密码不能为空")
        @Size(min = 6, max = 60, message = "密码长度必须在6-60之间")
        private String password;
    
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
    
            User user = (User) o;
    
            if (id != null ? !id.equals(user.id) : user.id != null) return false;
            return name != null ? name.equals(user.name) : user.name == null;
        }
    
        @Override
        public int hashCode() {
            int result = id != null ? id.hashCode() : 0;
            result = 31 * result + (name != null ? name.hashCode() : 0);
            return result;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id='" + id + '\'' +
                    ", name='" + name + '\'' +
                    '}';
        }
    }
    

    2、根据生成的class反编译后的代码

    package org.chushiyan.em.pojo;
    
    import java.io.Serializable;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    
    public class User implements Serializable {
      private String id;
      
      @NotNull(message = ")
      @Size(min = 2, max = 20, message = ")
      private String name;
      
      @NotNull(message = ")
      @Size(min = 6, max = 60, message = ")
      private String password;
      
      public void setId(String id) {
        this.id = id;
      }
      
      public void setName(String name) {
        this.name = name;
      }
      
      public void setPassword(String password) {
        this.password = password;
      }
      
      public String getId() {
        return this.id;
      }
      
      public String getName() {
        return this.name;
      }
      
      public String getPassword() {
        return this.password;
      }
      
      public boolean equals(Object o) {
        if (this == o)
          return true; 
        if (o == null || getClass() != o.getClass())
          return false; 
        User user = (User)o;
        if ((this.id != null) ? !this.id.equals(user.id) : (user.id != null))
          return false; 
        return (this.name != null) ? this.name.equals(user.name) : ((user.name == null));
      }
      
      public int hashCode() {
        int result = (this.id != null) ? this.id.hashCode() : 0;
        result = 31 * result + ((this.name != null) ? this.name.hashCode() : 0);
        return result;
      }
      
      public String toString() {
        return "User{id='" + this.id + '\'' + ", name='" + this.name + '\'' + '}';
      }
    }
    

    可以看到,equals()/hashCode()/toString()都是一样的。说明lombok对于已经存在的方法不会覆盖掉。

    相关文章

      网友评论

          本文标题:lombok的使用

          本文链接:https://www.haomeiwen.com/subject/trbioctx.html