在Java中使用Lombok的POJOs

102 阅读7分钟

什么是Lombok?

Lombok的创建者是这样定义它的。

它是一个能够自动插入你的编辑器和构建工具的java库,为你的java添砖加瓦。

所以,简单地说,这是一个可以用来使我们的事情更容易的库,而不是从头开始实现预期的功能。现在你要记住这一点。你以后会意识到这一事实。

如何应用于POJOs?

安装

所以,Lombok必须根据你的项目的构建插件,通过抓取它的依赖性来安装到你的项目中。它可以是Maven/Sbt或任何其他。所以,我给你的是Maven的依赖性,因为它是Java项目中最常用的构建工具。

<dependency>

使用方法

首先,我将把本节分为多个部分。然后我们可以逐一讨论。

Lombok在POJOs中的区别是什么?

让我深入探讨一下。通常,当我们创建一个POJO(或DTO)时,我们会指定一些字段和它们的访问方法,以便在我们插入它的地方进行操作。然后我们在这个类的基础上做很多事情,比如创建新的实例,存储对象,将它们转换为JSON等等。我们使用的所有这些操作都是一些相同的模板,我们重复这些操作。举个例子,我们在类中明确定义getters和setters,以实现封装。

如果我说我们在使用Lombok时不需要这样做,你会怎么想?这不是很好吗?

这就是Lombok的疯狂之处。让我们开始一步一步地理解它。

Getters, Setters, 和ToString方法

所以,这是使用Lombok的最简单也是最重要的一步。当我们创建一个POJO并将Lombok插入其中时,我们只需要在 只放字段和它们的类型在类中!甚至是字段的访问修改器都不需要。默认情况下,Lombok认为它们是私有字段。

在这种情况下,我们被提供了3种方法来实现封装。

  1. 数据注解

我们必须把**"@Data "** 注解放在类定义的顶部。因此,它将照顾到每个字段的Getters和Setters,ToString方法,Hashcode方法,Equals方法。

@Data

现在你可以得到用户名的getters和setters,即 getUserName(),电子邮件的getEmail()。你必须等到文章的构造函数部分完成后才能尝试。

2.获取器和设置器注解

假设你只需要Getters或Setters。那么你可以使用**"@Getter ""@Setter "**来代替"@Data"。这很简单!但是在这里我们没有得到任何其他的方法,就像我们在"@Data "注解中得到的那样。

@Getter

3.值注解

当你需要维护不可变的对象时,可以使用这个注解。简单地说,没有设置器。你不能修改字段。

@Value

构造函数

我们需要构造函数来创建新的对象。所以,我们必须告诉Lombok,我们需要这些构造函数。这里我们给出了3个选择。

  1. NoArgsConstructor

这与Java的默认构造函数相同。当我们使用它时,我们可以创建一个没有参数值的对象。

@NoArgsConstructor

例如:Employee emp = new Employee()。

通过创建一个新的对象来试试这个方法现在你可以看到如何访问getters和setters...

2.AllArgsConstructor

当我们使用这个注解时,我们有机会通过提供所有字段作为参数来创建一个对象。

@NoArgsConstructor

3.RequiredArgsConstructor

这个注解可以帮助我们在构造函数中加入一些强制参数。但是我们必须使用另一个名为**"@NonNull "的注解告诉Lombok哪些是必须的字段。**然后Lombok会按照我们在POJO类中定义的顺序来考虑它们。比方说,userName和email是必须的。所以我们可以这样修改这个类。

@Data

现在我们可以用3种构造函数来创建对象。

Employee employee1 = new Employee();

显式等价和哈希码

这是我们在Java中操作对象时发现的一个非常棘手的情况。通常,根据Java的内存模型,对象是在堆空间中创建的。只有它们的引用被保存在堆栈内存中。所以,假设你在一个Map中存储Employee对象,就像这样。Map<Id, Employee>。因此,你必须确定一件事!

如何将Employee对象从一个到另一个区分开来?协议是什么?

否则,你将会在不知道的情况下一次又一次地创建相同的Employee,从而在Heap上遇到内存问题!令人惊讶的是,堆空间将被太多的对象填满。

为了克服这个问题,我们必须覆盖Java中的**equals()hashcode()**方法,这些方法是由最上层的类提供的。对象。在那里我们可以选择一些字段来制作一个独特的Employee。Lombok提供了一个很好的方法来做到这一点。

@EqualsAndHashCode(onlyExplicitlyIncluded = true)

当我们把这个注解放在我们的类定义上面时,我们就准备好标记需要的字段了。 记住,注解里面的条件[onlyExplicitlyIncluded = true]将限制POJO使用注解的文件来区分对象,如下所示

@EqualsAndHashCode.Include

现在只要你创建具有相同用户名和Email的对象,它们就会被指向同一个对象 避免一次又一次地创建新对象.

@Data
    int age;
    double salary;

有各种各样的方法来尝试这个家伙!由于文章已经有点长了,我就不逐一解释了。 :)

使用生成器设计模式

这是我迄今为止在Lombok中发现的最不可思议的功能。你可能已经知道了Builder设计模式。只是 它允许我们随心所欲地创建对象,而且实体与构造函数并不紧密相连。.比方说,我们的雇员对象有30个属性/字段。所以,通过提供所有的属性来创建一个对象是非常困难的。在大多数情况下,我们不需要某些属性,因为有些属性对雇员来说是可选的。不需要像传统方式那样实现嵌套的Builder类,Lombok为我们提供了一个注解来实现整个构建器模式!这是不是很好?这不是很好吗?

但是我们必须注意一些事情。

  • 如果你使用**"@Builder "**注解,请不要定义构造器注解。因为现在对象的创建是完全松散耦合的。
  • 如果你用**"@NonNull "注解字段那么你就不能用构建器创建对象**而不提供那些标有"@NonNull "的字段。它将抛出一个异常!因此,你必须去掉null检查。
  • 当你需要通过JSON格式反序列化对象时,使用 **"@Jacksonized "**注解。当你把Lombok和 Jackson库一起使用时,它将会很有帮助
  • 如果我们没有使用"@Builder "注解为任何参数设置值,Lombok会将其值视为 "NULL"。
@Jacksonized
}

那么,如何在旅途中创建对象呢?请看下面的例子!

Employee employee1 = Employee.

你可以看到对象创建的差异。在第一种情况下,所有未定义的字段如firstName, lastName都将是NULL。同样的,这也适用于其他情况。

为字段设置默认值

比方说,你想*创建一个状态为 "活动 "的雇员。*简单地说,所有的雇员都必须有这个状态,而不需要明确地设置它。正如你现在所知道的,Builder将把这个属性值默认为NULL,因为我们不打算在创建对象时设置它。这就是我们要使用生成器默认机制的地方。我们只需要像下面那样对该字段进行注释。

@Builder.Default

这样一来,Employee类就会变成这样。

@Builder
}

你现在可以直接创建一个对象并打印,以查看雇员的状态它应该是这样的...

Employee(firstName=null, lastName=null, userName=salitha, email=salitha@gmail.com, designation=SE, age=28, salary=0.0, status=active)