使用lombok来简化你的Java Bean

能做什么?

在使用lombok之前:

public class Book {

    private Integer id;

    private String title;

    private Date releaseDate;

    private Double price;

    private String[] authors;

    private String publisher;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Date getReleaseDate() {
        return releaseDate;
    }

    public void setReleaseDate(Date releaseDate) {
        this.releaseDate = releaseDate;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public String[] getAuthors() {
        return authors;
    }

    public void setAuthors(String[] authors) {
        this.authors = authors;
    }

    public String getPublisher() {
        return publisher;
    }

    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Book)) return false;
        if (!super.equals(o)) return false;

        Book book = (Book) o;

        if (getId() != null ? !getId().equals(book.getId()) : book.getId() != null) return false;
        if (getTitle() != null ? !getTitle().equals(book.getTitle()) : book.getTitle() != null) return false;
        if (getReleaseDate() != null ? !getReleaseDate().equals(book.getReleaseDate()) : book.getReleaseDate() != null)
            return false;
        if (getPrice() != null ? !getPrice().equals(book.getPrice()) : book.getPrice() != null) return false;
        // Probably incorrect - comparing Object[] arrays with Arrays.equals
        if (!Arrays.equals(getAuthors(), book.getAuthors())) return false;
        return getPublisher() != null ? getPublisher().equals(book.getPublisher()) : book.getPublisher() == null;
    }

    @Override
    public int hashCode() {
        int result = super.hashCode();
        result = 31 * result + (getId() != null ? getId().hashCode() : 0);
        result = 31 * result + (getTitle() != null ? getTitle().hashCode() : 0);
        result = 31 * result + (getReleaseDate() != null ? getReleaseDate().hashCode() : 0);
        result = 31 * result + (getPrice() != null ? getPrice().hashCode() : 0);
        result = 31 * result + Arrays.hashCode(getAuthors());
        result = 31 * result + (getPublisher() != null ? getPublisher().hashCode() : 0);
        return result;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", releaseDate=" + releaseDate +
                ", price=" + price +
                ", authors=" + Arrays.toString(authors) +
                ", publisher='" + publisher + '\'' +
                '}';
    }
}

在使用之后:

@Data
public class Book {

    private Integer id;

    private String title;

    private Date releaseDate;

    private Double price;

    private String[] authors;

    private String publisher;
}

并且从功能上,使用后=使用前。
说的简单点:从此以后不需要写GetterSettertoStringhashCodecanEqualconstructor这些大部分相似,却又不得不写的代码了。

怎么用?

一共有三个步骤

  1. 为你的开发工具安装插件。

    • IntelliJ IDEA: settings->Plugins->Browse Repositories->搜索Lombok Plugin->install

    • Eclipse / MyEclipse / Spring Tool Suite / JBoss Developer Studio: 看这里

    • Netbeans: 看这里

  2. 下载并导入Jar包,下载地址

  3. 在需要的类上标注注解

目前我使用的版本是1.16.16,有下面几个常用注解:

@Date

生成GetterSettertoStringequalshashCode方法。

可标注:Class

@Value

生成GettertoStringequalshashCode、还有全字段的构造方法。并且会将字段全都添加final

可标注:Class

@Builder

在类内部生成一个名为类名+Builder的内部类,用于快速构建。

可标注:Class

你可以这样使用它:

@Builder
public class Book {

    private Integer id;

    private String title;

    private Date releaseDate;

    private Double price;

    private String[] authors;

    private String publisher;

}
public static void main(String[] args) {
    Book book = Book.builder().id(1).title("书名").build();
}

@Getter/@Setter

生成GetterSetter方法。如果标注在类上则会生成这个类中所有字段的GetterSetter方法。

可标注:Field,Class

@NonNull

为你的构造函数、Setter添加空值校验。标注的字段赋值为空时,会抛出NullPointerException

可标注:Field,Method,Parameter,Local Variable

为什么?

自从Java 6起,Javac就支持了一个名叫JSR 269 Pluggable Annotation Processing API的规范,它的作用就是:如果你实现了这个API,在Javac编译时就会得到调用。而lombok正是运用了这一点。

流程是这样的:

  1. Javac编译源代码,并生成语法树(AST)

  2. Javac寻找实现了JSR 269 .... API的代码(lombok),并调用。

  3. lombok寻找被标注了注解的类,修改Javac生成的语法树(AST)。

  4. Javac将语法树生成为字节码(.class)

就到这里了

它还具备很多好用的功能,你可以去这里看看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lombok并不提供参数校验的功能,但是我们可以结合使用LombokJava Bean Validation API来实现参数校验。 Java Bean Validation API提供了一套API,可以在JavaBean中使用注解来进行参数校验。我们可以在Lombok生成的Getter和Setter方法上添加注解,通过使用Java Bean Validation API进行参数校验。 举个例子,我们可以在一个User类的属性上添加注解@NotNull来表示该属性不能为空: ```java import lombok.Getter; import lombok.Setter; import javax.validation.constraints.NotNull; @Getter @Setter public class User { @NotNull(message = "用户名不能为空") private String username; private String password; } ``` 接下来,我们可以在调用Setter方法之前对参数进行校验: ```java import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; public class UserService { private Validator validator; public UserService() { ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); validator = validatorFactory.getValidator(); } public void addUser(User user) { Set<ConstraintViolation<User>> violations = validator.validate(user); if (!violations.isEmpty()) { throw new ConstraintViolationException(violations); } // 添加用户 } } ``` 在上面的代码中,我们首先获取一个Validator对象,然后在添加用户时调用validate方法进行参数校验。如果有校验不通过的情况,我们可以抛出一个ConstraintViolationException异常来提示用户。 需要注意的是,为了使用Java Bean Validation API进行参数校验,我们需要在项目中添加javax.validation:validation-api和Hibernate Validator的依赖。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值