首页 Java java教程 Java 中的 Lombok 项目

Java 中的 Lombok 项目

Jan 08, 2025 pm 10:24 PM

Proyecto Lombok en Java

介绍

Lombok 是一个充当 Java 注释处理器的库,旨在消除代码中的冗余。它的主要功能是自动生成重复代码或“样板文件”——这些元素虽然必要,但不会为我们的程序逻辑添加直接价值。主要用于在编译时自动生成 getter 和 setter 方法、构造函数、equals()、hashCode()、toString() 方法以及 Java 类中的其他常见元素。

无需为这些基本功能手动编写数十行代码,Lombok 允许您使用简单的注释来定义它们,从而产生更干净、更易于维护且不易出错的代码。

设施

要在Java项目中使用Lombok,除了安装之外,还需要在pom.xml文件(如果是Maven项目)或build.gradle(如果是Gradle项目)中添加相应的依赖我们正在使用的IDE中的相应插件。在这篇文章中,我们将使用 Maven 和 IntelliJ IDEA 作为示例。

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.36</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
登录后复制
登录后复制
登录后复制
登录后复制

如有任何疑问,您可以随时查看Lombok的官方文档:

  • Lombok 与 Maven
  • IntelliJ IDEA 中的 Lombok

@数据

当我们创建一个类时,我们会定期执行以下操作,无论是手动还是使用 IDE 提供的快捷方式:

  • 封装属性并生成其getter和setter方法
  • 生成一个空的构造函数和另一个接收所有属性的
  • 实现 equals()、hashCode() 和 toString() 方法

嗯,Lombok 有 @Data 注释,它允许我们在一行中完成所有这些操作,生成与 POJO(普通旧 Java 对象) 相关的所有内容。这个注解是 @Getter、@Setter、@EqualsAndHashCode、@NoArgsConstructor 和 @AllArgsConstructor 注解的组合,我们稍后会看到。

import lombok.Data;

@Data
public class Persona {
    private String nombre;
}
登录后复制
登录后复制
登录后复制
登录后复制
public class Main {
    public static void main(String[] args) {
        Persona p1 = new Persona();
        p2.setNombre("Maria");

        System.out.println(p1.getNombre());
    }
}
登录后复制
登录后复制
登录后复制
登录后复制

@NoArgsConstructor、@AllArgsConstructor 和 @RequiredArgsConstructor

这些注释允许我们自动生成具有不同参数组合的构造函数,考虑到属性是根据它们在类中声明的顺序使用的。

  • @NoArgsConstructor:生成一个无参构造函数(空),如果无法生成,则会抛出异常,为了避免这种情况,只需使用如下注解 @NoArgsConstructor(force = true)。
  • @AllArgsConstructor:生成一个构造函数,以类的所有属性作为参数。
  • @RequiredArgsConstructor:为所有最终字段生成构造函数和/或用 @NonNull 注释进行标记。
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.36</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
登录后复制
登录后复制
登录后复制
登录后复制

@Getter 和 @setter

这些注解可以让我们自动为类的所有属性生成 getter 和 setter 方法,或者只为那些标有相应注解的属性生成 getter 和 setter 方法,即可以在类或属性级别使用。

import lombok.Data;

@Data
public class Persona {
    private String nombre;
}
登录后复制
登录后复制
登录后复制
登录后复制
public class Main {
    public static void main(String[] args) {
        Persona p1 = new Persona();
        p2.setNombre("Maria");

        System.out.println(p1.getNombre());
    }
}
登录后复制
登录后复制
登录后复制
登录后复制

@ToString

该注解自动生成 toString() 方法,该方法返回类及其属性的字符串表示形式,格式如下:ClassName(attribute1=value1, attribute2=value2, ...)。默认情况下,类的所有非静态属性都包含在结果中,但可以使用 @ToString.Exclude 属性排除特定属性。如果您只想显示属性的值而不是声明的名称,可以使用 @ToString(includeFieldNames = false)。

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Persona {
    private String nombre;
}
登录后复制
登录后复制

@EqualsAndHashCode

允许您从类的所有属性生成 equals() 和 hashCode() 方法,如果您想排除或包含某个属性,可以使用注释 @EqualsAndHashCode.Exclude 和 @EqualsAndHashCode.Include 来实现。分别。

import lombok.*;

@Getter
@Setter
public class Persona {
    private String nombre;
    private String apellido;
}
登录后复制
登录后复制

@价值

以前,在 Java 中创建不可变类需要执行一系列步骤,例如使类和/或属性成为最终类型,并且不会生成 setter 方法。 Lombok 使我们可以轻松地使用 @Value 注解创建不可变类,该注解结合了 @Getter、@ToString、@EqualsAndHashCode 和 @AllArgsConstructor 注解来生成不可变类。所有属性都标记为 private Final,并且不会生成 setter 方法。它是 @Data 的不可变变体。

import lombok.*;

public class Persona {
    @Getter @Setter
    private String nombre;
    private String apellido;
}
登录后复制
登录后复制

在 Java 的最新版本中,与使用记录相比,此注释失去了意义,因为它们具有相同的目的,并且使用记录更实用。如果您有兴趣了解更多有关此主题的信息,博客上还有更多有关记录的帖子。

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.36</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
登录后复制
登录后复制
登录后复制
登录后复制

@val

这个注解允许我们将一个变量声明为final并自动推断它的数据类型,也就是说,不需要指定变量的数据类型,Lombok会负责推断它。如果变量数据类型很长或很复杂,它很有用,这样可以避免重复。

import lombok.Data;

@Data
public class Persona {
    private String nombre;
}
登录后复制
登录后复制
登录后复制
登录后复制

如果我们直接使用final var或者简单的var进行类型推断,这个注解可能会失去意义,因为这是语言的特性,这样更方便。如果您有兴趣了解更多,可以参考以下帖子

public class Main {
    public static void main(String[] args) {
        Persona p1 = new Persona();
        p2.setNombre("Maria");

        System.out.println(p1.getNombre());
    }
}
登录后复制
登录后复制
登录后复制
登录后复制

@var

它的工作方式与@val完全相同,但它不将变量声明为final,它只是推断其类型。有必要考虑类型推断的概念,因为您不能声明 String 类型的内容,并且想要为其分配 int 类型的值也不是最终的。同样,在最新版本的 Java 中,该注释被 var 取代。

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Persona {
    private String nombre;
}
登录后复制
登录后复制

@非空

这个注解可以用在类的属性和方法的参数上,它基本上表明属性的值不能为空,如果尝试将空值分配给标记为@NonNull的属性,它会抛出 NullPointerException,即使用 if (param == null) throw new NullPointerException("param is tagged non-null but is null"); 。无论它生成什么异常,它的使用在 IDE 本身中都更加明显,因为它会以某种方式向我们表明该值不能为空。

import lombok.*;

@Getter
@Setter
public class Persona {
    private String nombre;
    private String apellido;
}
登录后复制
登录后复制

@清理

此注释允许我们确保任何使用它的资源(如果它具有 close() 方法或实现 AutoCloseable 或 Closeable 接口)都会在其所在代码块的末尾自动关闭。它在处理需要释放的资源时非常有用,例如文件、数据库连接等。

import lombok.*;

public class Persona {
    @Getter @Setter
    private String nombre;
    private String apellido;
}
登录后复制
登录后复制

如果我们使用资源尝试,可以手动获得此结果。

import lombok.*;

@AllArgsConstructor
@ToString
public class Persona {
    private String nombre;
    @ToString.Exclude
    private String apellido;
}

// Output: Persona(nombre=Maria)
登录后复制

@builder

这个注解可以让我们自动生成一个设计模式Builder,即一个可以让我们一步步构建复杂对象的对象,这样就可以配置一个对象的不同属性,而无需调用带有多个参数的构造函数。如果一个类有很多属性并且我们不希望有一个带有很多参数的构造函数,那么它很有用。

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.36</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
登录后复制
登录后复制
登录后复制
登录后复制

@和

这个注解允许我们创建一个方法,该方法返回带有修改属性的当前对象的副本,即它生成一个方法 withAttributeName(Object object) ,该方法允许我们用该对象创建当前对象的副本属性由我们作为参数传递的值修改。当我们想要修改对象的属性而不修改原始对象时,它非常有用。

import lombok.Data;

@Data
public class Persona {
    private String nombre;
}
登录后复制
登录后复制
登录后复制
登录后复制
public class Main {
    public static void main(String[] args) {
        Persona p1 = new Persona();
        p2.setNombre("Maria");

        System.out.println(p1.getNombre());
    }
}
登录后复制
登录后复制
登录后复制
登录后复制

到目前为止,我们已经看到了一些最常用的注释,每个注释可能接受也可能不接受额外的配置,同样还有其他注释被标记为实验性的,无论如何,参考很重要官方文档,以充分利用 Lombok 为我们提供的所有功能以及重复代码生成方面的优势。

以上是Java 中的 Lombok 项目的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

公司安全软件导致应用无法运行?如何排查和解决? 公司安全软件导致应用无法运行?如何排查和解决? Apr 19, 2025 pm 04:51 PM

公司安全软件导致部分应用无法正常运行的排查与解决方法许多公司为了保障内部网络安全,会部署安全软件。...

如何使用MapStruct简化系统对接中的字段映射问题? 如何使用MapStruct简化系统对接中的字段映射问题? Apr 19, 2025 pm 06:21 PM

系统对接中的字段映射处理在进行系统对接时,常常会遇到一个棘手的问题:如何将A系统的接口字段有效地映�...

如何优雅地获取实体类变量名构建数据库查询条件? 如何优雅地获取实体类变量名构建数据库查询条件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架进行数据库操作时,经常需要根据实体类的属性名构造查询条件。如果每次都手动...

如何将姓名转换为数字以实现排序并保持群组中的一致性? 如何将姓名转换为数字以实现排序并保持群组中的一致性? Apr 19, 2025 pm 11:30 PM

将姓名转换为数字以实现排序的解决方案在许多应用场景中,用户可能需要在群组中进行排序,尤其是在一个用...

IntelliJ IDEA是如何在不输出日志的情况下识别Spring Boot项目的端口号的? IntelliJ IDEA是如何在不输出日志的情况下识别Spring Boot项目的端口号的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本启动Spring...

Java对象如何安全地转换为数组? Java对象如何安全地转换为数组? Apr 19, 2025 pm 11:33 PM

Java对象与数组的转换:深入探讨强制类型转换的风险与正确方法很多Java初学者会遇到将一个对象转换成数组的�...

电商平台SKU和SPU数据库设计:如何兼顾用户自定义属性和无属性商品? 电商平台SKU和SPU数据库设计:如何兼顾用户自定义属性和无属性商品? Apr 19, 2025 pm 11:27 PM

电商平台SKU和SPU表设计详解本文将探讨电商平台中SKU和SPU的数据库设计问题,特别是如何处理用户自定义销售属...

使用TKMyBatis进行数据库查询时,如何优雅地获取实体类变量名构建查询条件? 使用TKMyBatis进行数据库查询时,如何优雅地获取实体类变量名构建查询条件? Apr 19, 2025 pm 09:51 PM

在使用TKMyBatis进行数据库查询时,如何优雅地获取实体类变量名以构建查询条件,是一个常见的难题。本文将针...

See all articles