什么是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种方法来实现封装。
- 数据注解
我们必须把**"@Data "** 注解放在类定义的顶部。因此,它将照顾到每个字段的Getters和Setters,ToString方法,Hashcode方法,Equals方法。
@Data
现在你可以得到用户名的getters和setters,即 getUserName(),电子邮件的getEmail()。你必须等到文章的构造函数部分完成后才能尝试。
2.获取器和设置器注解
假设你只需要Getters或Setters。那么你可以使用**"@Getter "或"@Setter "**来代替"@Data"。这很简单!但是在这里我们没有得到任何其他的方法,就像我们在"@Data "注解中得到的那样。
@Getter
3.值注解
当你需要维护不可变的对象时,可以使用这个注解。简单地说,没有设置器。你不能修改字段。
@Value
构造函数
我们需要构造函数来创建新的对象。所以,我们必须告诉Lombok,我们需要这些构造函数。这里我们给出了3个选择。
- 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)