lombok的使用

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容