LomBok在idea的安装以及lombok使用简介

LomBok在idea的安装以及lombok使用简介

和其他语言相比, Java经常因为不必要的冗长被批评。 Lombok提供了一系列注解用以在后台生成模板代码,将其从你的类中删除,从而有助于保持你的代码整洁。较少的模板意味着更简洁的代码,更易于阅读和维护。在本文中,我将涉及我经常使用的 Lombok功能,并想你展示如何使用他们生产更清晰、更简洁的代码。

1.LomBok插件在idea的安装

1.1打开idea。file——>settings——>Plugins——>LomBok
点击install,应用Apply,OK就好了

在这里插入图片描述
1.2在POM里面引入lombok依赖
在这里插入图片描述

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

然后就可以直接使用了,下面是一些lombok的简单使用

2.lombok的简单使用

局部变量类型推断:val 和 var

许多语言通过查看等号右侧的表达式来推断局部变量类型。尽管现在 Java10+已经支持这种功能,但在之前的版本中没有 Lombok的帮助就无法实现。下面的代码段展示了如何显式指定局部类型:

在这里插入图片描述

在 Lombok中,我们可以通过使用 val来缩短它,如下所示:

在这里插入图片描述
注意, val在背后创建了一个 final且不可变的变量。如果你需要一个可变本地变量,可以使用 var。


@NonNull

对方法参数进行 null检查通常不是一个坏主意,特别是如果该方法形成的 API被其他开发者使用。虽然这些检查很简单,但是他们可能变得冗长,特别是当你有多个参数时。如下所示,额外的代码无助于可读性,并且可能从方法的主要目的分散注意力。

public void nonNullDemo(Employee employee, Account account) {
        
        if (employee == null) {
            throw new IllegalArgumentException("Employee is marked @NonNull but is null");
        }
        
        if (account == null) {
            throw new IllegalArgumentException("Account is marked @NonNull but is null");
        }

    }

理想情况下,你需要 null检查——没有干扰的那种。这就是 @NonNull发挥作用的地方。通过用 @NonNull标记参数, Lombok替你为该参数生成 null检查。你的方法突然变得更加简洁,但没有丢失那些安全性的 null检查。

public void nonNullDemo(@NonNull Employee employee, @NonNull Account account) {

// just do stuff
    }

默认情况下, Lombok会抛出 NullPointerException,如果你愿意,可以配置 Lombok抛出 IllegalArgumentException。我个人更喜欢

IllegalArgumentException,因为我认为它更适合于对参数检查。


更简洁的数据类

数据类是 Lombok真正有助于减少模板代码的领域。在查看该选项前,思考一下我们经常需要处理的模板种类。数据类通常包括以下一种或全部:

  • 构造函数(有或没有参数)
  • 私有成员变量的 getter 方法
  • 私有非 final 成员变量的 setter 方法
  • 帮助记录日志的 toString 方法
  • equals 和 hashCode(处理相等/集合)

可以通过 IDE 生成以上内容,因此问题不在于编写他们花费的时间。问题是带有少量成员变量的简单类很快会变得非常冗长。让我们看看 Lombok如何通过处理上述的每一项来减少混乱。

Lombok可以替你生成 getter和 setter模板。通过对每个成员变量使用 @Getter和 @Setter注解,你最终得到一个等效的类,如下所示:

注意,你可以在非 final成员变量上只使用 @Setter。在 final成员变量上使用它将导致编译错误。

如果你需要为每个成员变量生成 getter和 setter,你也可以在类级别使用 @Getter和 @Setter,如下所示。

在你的数据类上覆盖 toString方法是有助于记录日志的良好实践。IDE 为 UserInfo 类生成的 toString方法如下所示

package com.jmccms.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Date;

/**
 * @Description: 用户详情表
 * @BelongsProject: Jmccms
 * @BelongsPackage: com.jmccms.entity
 * @Author: ChenYongJia
 * @CreateTime: 2019-05-02 17:25
 * @Email chen87647213@163.com
 */
@SuppressWarnings("serial")
@Getter
@Setter
@AllArgsConstructor // 自动所有参数的构造方法方法
@NoArgsConstructor // 自动无参的构造方法方法
@Entity
@Table(name = "jmccms_user_info")
public class UserInfo implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @OrderBy
    @Column(columnDefinition = "bigint(19) unsigned  COMMENT '用户详情id'")
    private Long userInfoId;
    @Column(columnDefinition = "varchar(64) NOT NULL COMMENT '用户名称'  ")
    private String userInfoName;
    @Column(columnDefinition = "varchar(200) COMMENT '用户详细地址'  ")
    private String userInfoAddress;
    @Column(columnDefinition = "varchar(11) NOT NULL COMMENT '用户电话'  ")
    private String userInfoPhone;
    @Column(columnDefinition = "tinyint unsigned DEFAULT 1 COMMENT '用户年龄'  ")
    private Long userInfoAge;
    @Column(columnDefinition = "char(1) DEFAULT 0 COMMENT '用户性别(0:男 1:女)'  ")
    private String userInfoSex;
    @Column(columnDefinition = "date COMMENT '用户生日'  ")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date userInfoBirthday;
    @Column(columnDefinition = "varchar(100) NOT NULL COMMENT '用户邮箱地址'  ")
    private String userInfoEmail;
    @Column(columnDefinition = "char(1) DEFAULT '否'  COMMENT '是否锁定'")
    private String userInfoIsLookout;
    @Column(columnDefinition = "datetime COMMENT '用户锁定时间' ")
    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")	//日期格式化为中国的时区 东8区
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")	//接受::字符串日期需要格式化为日期类型
    private Date userInfoLockTime;
    @Column(columnDefinition = "tinyint unsigned DEFAULT 0 COMMENT '密码错误次数'")
    private Integer userInfoPsdWrongTime;
    @Column(columnDefinition = "varchar(100) COMMENT '用户简介描述'  ")
    private String userInfoRemark;
    @Column(columnDefinition = "datetime COMMENT '创建时间' ")
    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")	//日期格式化为中国的时区 东8区
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")	//接受::字符串日期需要格式化为日期类型
    private Date userInfoCreateTime;
    @Column(columnDefinition = "datetime COMMENT '最后一次修改时间'")
    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")	//日期格式化为中国的时区 东8区
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")	//接受::字符串日期需要格式化为日期类型
    private Date userInfoLastUpdateTime;
    @Column(columnDefinition = "varchar(64) NOT NULL COMMENT '创建人'  ")
    private String userInfoFounder;
    @Column(columnDefinition = "varchar(64) COMMENT '修改人'  ")
    private String userInfoUpdateMan;

}

我们可以使用 @AllArgsConstructor注解实现同样功能。 @Getter和 @Setter、 @AllArgsConstructor减少模板,保持类更干净且更简洁。

还有其他选项用于生成构造函数。 @RequiredArgsConstructor将创建带有每个 final成员变量参数的构造函数, @NoArgsConstructor将创建没有参数的构造函数。

默认情况下, Lombok生成包含所有成员变量的 toString方法。可以通过 exclude属性 @ToString(exclude={“someField”},“someOtherField”}) 覆盖行为将某些成员变量排除。


@Data

如果你想使数据类尽可能精简,可以使用 @Data注解。 @Data 是 @Getter、 @Setter、 @ToString、 @EqualsAndHashCode 和 @RequiredArgsConstructor 的快捷方式。

通过使用 @Data,我们可以将上面的类精简到极致:


使用 @Buidler 创建对象

建造者设计模式描述了一种灵活的创建对象的方式。 Lombok可以帮你轻松的实现该模式。看一个使用简单 UserInfo 类的示例。假设我们希望可以创建各种 UserInfo 对象,但我们希望在创建时设置的属性具有灵活性。

package com.jmccms.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Date;

/**
 * @Description: 用户详情表
 * @BelongsProject: Jmccms
 * @BelongsPackage: com.jmccms.entity
 * @Author: ChenYongJia
 * @CreateTime: 2019-05-02 17:25
 * @Email chen87647213@163.com
 */
@SuppressWarnings("serial")
@Getter
@Setter
@AllArgsConstructor // 自动所有参数的构造方法方法
@NoArgsConstructor // 自动无参的构造方法方法
@Entity
@Builder
@Table(name = "jmccms_user_info")
public class UserInfo implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @OrderBy
    @Column(columnDefinition = "bigint(19) unsigned  COMMENT '用户详情id'")
    private Long userInfoId;
    @Column(columnDefinition = "varchar(64) NOT NULL COMMENT '用户名称'  ")
    private String userInfoName;
    @Column(columnDefinition = "varchar(200) COMMENT '用户详细地址'  ")
    private String userInfoAddress;
    @Column(columnDefinition = "varchar(11) NOT NULL COMMENT '用户电话'  ")
    private String userInfoPhone;
    @Column(columnDefinition = "tinyint unsigned DEFAULT 1 COMMENT '用户年龄'  ")
    private Long userInfoAge;
    @Column(columnDefinition = "char(1) DEFAULT 0 COMMENT '用户性别(0:男 1:女)'  ")
    private String userInfoSex;
    @Column(columnDefinition = "date COMMENT '用户生日'  ")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date userInfoBirthday;
    @Column(columnDefinition = "varchar(100) NOT NULL COMMENT '用户邮箱地址'  ")
    private String userInfoEmail;
    @Column(columnDefinition = "char(1) DEFAULT '否'  COMMENT '是否锁定'")
    private String userInfoIsLookout;
    @Column(columnDefinition = "datetime COMMENT '用户锁定时间' ")
    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")	//日期格式化为中国的时区 东8区
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")	//接受::字符串日期需要格式化为日期类型
    private Date userInfoLockTime;
    @Column(columnDefinition = "tinyint unsigned DEFAULT 0 COMMENT '密码错误次数'")
    private Integer userInfoPsdWrongTime;
    @Column(columnDefinition = "varchar(100) COMMENT '用户简介描述'  ")
    private String userInfoRemark;
    @Column(columnDefinition = "datetime COMMENT '创建时间' ")
    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")	//日期格式化为中国的时区 东8区
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")	//接受::字符串日期需要格式化为日期类型
    private Date userInfoCreateTime;
    @Column(columnDefinition = "datetime COMMENT '最后一次修改时间'")
    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")	//日期格式化为中国的时区 东8区
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")	//接受::字符串日期需要格式化为日期类型
    private Date userInfoLastUpdateTime;
    @Column(columnDefinition = "varchar(64) NOT NULL COMMENT '创建人'  ")
    private String userInfoFounder;
    @Column(columnDefinition = "varchar(64) COMMENT '修改人'  ")
    private String userInfoUpdateMan;

}

假设我们要创建一个 UserInfo,但只想设置 make和 model。在 UserInfo上使用标准的全参数构造函数意味着我们只提供 make和 model并设置其他参数为 null。

UserInfo userInfo=new UserInfo(放入参数);

这可行但并不理想,我们必须为我们不感兴趣的参数传递 null。我们可以创建一个只接受 make和 model的构造函数来避开这个问题。这是一个合理的解决方法,但不够灵活。如果我们有许多不同的字段排列,我们可以用什么来创建一个新 UserInfo?最终我们得到了一堆不同的构造函数,代表了我们可以实例化 UserInfo的所有可能方式。

解决该问题的一种干净、灵活的方式是使用建造者模式。 Lombok通过 @Builder 注解帮你实现建造者模式。当你使用 @Builder注解 UserInfo类时, Lombok会执行以下操作:

  • 添加一个私有构造函数到 Car
  • 创建一个静态的 UserInfo类
  • 在 UserInfoBuilder中为 UserInfo中的每个成员创建一个 setter风格方法。
  • 在 UserInfoBuilder中添加创建 UserInfo的新实例的建造方法。

UserInfoBuilder上的每个 setter风格方法返回自身的实例( UserInfoBuilder)。这允许你进行方法链式调用并为对象创建提供流畅的 API。让我们看看它如何使用。

  UserInfo userInfo=UserInfo.builder.参数属性(放入值).连续重复.最后用build()收尾;

另一个值得一提的方便的注解是 @Singular。默认情况下,Lombok 为集合创建使用集合参数的标准的 setter 风格方法。

向集合成员变量添加 @Singular将提供一个额外的方法,允许你向集合添加单个项。


日志

Lombok另一个伟大的功能是日志记录器。如果没有 Lombok,要实例化标准的 SLF4J日志记录器,常用的写法想必大家已经写烂了吧就不再写了.

日志记录器很沉重,并为每个需要日志记录的类添加了不必要的混乱。值得庆幸的是 Lombok提供了一个为你创建日志记录器的注解。你要做的所有事情就是在类上添加注解,这样就可以了。

使用了 @SLF4J注解,但 Lombok能为几乎所有通用 Java日志框架生成日志记录器。有关更多日志记录器的选项,请参阅文档。


Lombok给你控制权

我非常喜欢 Lombok的一点是它的不侵入性。。如果你决定在使用如 @Getter、 @Setter 或 @ToString时也想要自己的方法实现,你的方法将总是优先于 Lombok。它允许你在大多数时间使用 Lombok,但在你需要的时候仍有控制权。

最后

  • 更多参考精彩博文请看这里:陈永佳的博客

  • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈永佳

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值