lombok的使用

2019-12-31  本文已影响0人  chushiyan

一、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对于已经存在的方法不会覆盖掉。

上一篇下一篇

猜你喜欢

热点阅读