当前位置: 首页 > news >正文

Lombok注解 - 提高Java开发效率

在这里插入图片描述

01 繁琐编码

初入 Java 开发领域时,编写实体类的琐碎经历想必各位都深有感触。

每当创建一个实体类,铺天盖地的 getter、setter、toString 方法接踵而至,手指在键盘上频繁敲击,酸痛不已。

而 Lombok 这一神器的出现,宛如黑暗中的一道曙光,凭借注解技术,在编译阶段自动产出那些令人厌烦的样板代码,极大地减轻了开发人员的负担。

02 基础注解

1. @Getter 与 @Setter

这两个注解堪称懒人福音。

试想一个拥有多个私有字段的 User 类,若手动编写 getter 和 setter 方法,代码量瞬间膨胀。

而使用 @Getter 和 @Setter 后,一切变得简洁明了。

@Getter
@Setter
public  class  User {private  String  name; // 用户名private  int age;     // 用户年龄
}

注解 :

  1. @Getter 为每个私有字段生成对应的 getXxx() 方法。

  2. @Setter 则生成 setXxx() 方法,方便外部修改字段值。

  3. 这使得 User 类的字段操作变得异常便捷。

但实际场景中,有些字段可能无需 setter 方法,例如数据库中的主键 ID 字段,通常不希望被随意修改。

此时,可仅在类上标注 @Getter,对需要 setter 的字段单独使用 @Setter。

2. 构造方法相关注解

• @NoArgsConstructor :如其名,生成无参构造方法。
在需要实例化但不立即赋值的场景下非常实用。

• @AllArgsConstructor :生成包含所有字段的构造方法,方便一次性为所有属性赋值。

@NoArgsConstructor
@AllArgsConstructor
public  class  Product {private  Long   id;         // 产品 IDprivate  String   name;     // 产品名称private  BigDecimal  price; // 产品价格
}

注解 :

  1. @NoArgsConstructor 提供无参构造,方便反序列化等场景。

  2. @AllArgsConstructor 使得创建 Product 对象时可直接传入所有属性值,提高开发效率。

3. 但若某些字段应为必填(如产品名称和价格),而 ID 可由数据库自动生成,@AllArgsConstructor 可能会导致字段赋值不符合业务逻辑。

这时,@RequiredArgsConstructor 便大显身手。

它会为所有 final 字段和带有 @NonNull 注解的字段生成构造参数。

public  class  Order {private  final   Long  id; // 订单 ID,final  表示不可修改private  String   orderNo; // 订单编号@NonNullprivate  Customer  customer; // 客户信息,@NonNull 表示非空private  String   remark; // 备注
}
public  class  ProductService {private  final   ProductMapper  productMapper; // 数据库映射器private  final   Cache  productCache; // 缓存
}

注解 :

  1. @RequiredArgsConstructor 针对 final 字段和 @NonNull 注解字段生成构造方法。

  2. 保证关键字段在对象创建时就被正确初始化。

  3. 避免了非必填字段在构造方法中强制出现,使构造逻辑更符合业务规则。

03 进阶注解:提升开发体验

1. @Data

堪称 Lombok 中的瑞士军刀,它集 @Getter、@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor 于一身。

一个简单的 Employee 类,使用 @Data 后,几乎所有常用方法都已就绪。

@Data
public  class  Employee {private  Long  id;         // 员工 IDprivate  String  name;     // 员工姓名private  Department department; // 所属部门
}

注解 :

  1. 自动生成 Getter 和 Setter 方法,方便字段读写。

  2. 重写 toString() 方法,便于对象信息的查看与调试。

  3. 实现 equals() 和 hashCode() 方法,基于所有字段进行比较和哈希计算。

  4. 提供包含 final 字段的构造方法。

但需注意,@Data 生成的 Setter 方法会让所有字段均可修改,这在某些场景下可能引发数据安全问题。

比如对于一些敏感信息或业务规则明确不可变的字段,我们更倾向于使用只读的注解组合。

2. @Value

与 @Data 相对应,@Value 生成的类是不可变的,所有字段都是 final 的,非常适合表示值对象。

@Value
public  class  Point {int x; // 坐标 x 值int y; // 坐标 y 值
}

注解 :

  1. 自动为字段生成 Getter 方法。

  2. 字段默认为 final ,保证对象创建后其状态不可改变。

  3. 重写 equals() 和 hashCode() 方法,基于字段内容进行比较。

这种不可变性在多线程环境下尤为可贵,能有效避免并发修改带来的问题。

3. 日志注解 @Slf4j

开发过程中,日志记录是追踪程序行为、排查问题的关键手段。

手动创建 Logger 对象既繁琐又容易出错,而 @Slf4j 能自动为类生成 Logger 字段。

import lombok.extern.slf4j.Slf4j;@Slf4j
public  class  OrderService {public  void  createOrder(Order order) {log.info("Creating order: {}", order); // 记录订单创建信息}
}

注解 :

  1. @Slf4j 自动引入 slf4j 日志框架的 Logger 对象。

  2. 通过 log.info() 等方法,可方便地输出不同级别的日志信息。

  3. 提高代码整洁性,使日志记录操作更加直观、简洁。

4. 建造者注解 @Builder

当面对包含众多可选参数的类时,传统的构造方法会变得冗长且难以维护。

@Builder 注解巧妙地运用建造者模式,巧妙地解决了这一难题。

@Builder
publicclassComputer {private  String  cpu;     // 中央处理器private  String  memory;  // 内存private  String  disk;    // 硬盘private  String  gpu;     // 显卡
}// 使用建造者模式创建 Computer 对象
ComputermyPC= Computer.builder().cpu("i7").memory("16GB").disk("512GB SSD").build();

注解 :

  1. @Builder 为每个字段生成一个建造者方法。

  2. 通过链式调用,可清晰地指定每个参数的值。

  3. 对于非必需参数,可以选择性地设置,提高了代码的灵活性和可读性。

这种风格在配置类、复杂对象创建场景中格外受欢迎,能让代码逻辑更加清晰、易于理解和维护。

5. 非空注解 @NonNull

@NonNull 注解犹如程序中的安全卫士,在编译期便能发现潜在的空指针问题。

当标注了 @NonNull 的参数传入 null 时,Lombok 会果断抛出 NullPointerException,避免程序在运行时因空指针异常而崩溃。

public  class  StringUtil {public  void  process(@NonNull String  input) {System.out.println(input.length());}
}

注解 :

  1. @NonNull 用于方法参数时,确保传入的参数不能为 null。

  2. 在编译阶段就能捕获可能的空值风险。

  3. 提高代码的健壮性和可靠性,减少因空指针导致的程序错误。

6. 懒加载技术

对于那些初始化成本高昂的字段,采用懒加载策略可以优化程序性能。

只有在第一次访问该字段时,才进行初始化操作。

public  classHeavyResource {privatefinal  Map<String , Object > cachedData;publicHeavyResource() {cachedData = null; // 初始化为 null}public  Map<String , Object > getCachedData() {if (cachedData == null) {cachedData = initCache();}return  cachedData;}private  Map<String , Object > initCache() {// 模拟初始化耗时操作Map<String , Object > map = newHashMap<>();// 填充数据...return  map;}
}

注解 :

  1. cachedData 字段初始为 null。

  2. 当第一次调用 getCachedData() 方法时,才执行 initCache() 方法进行初始化。

  3. 避免了对象创建时就进行不必要的资源消耗,提升了程序启动和运行的效率。

04 实际项目中的注解搭配策略

在实际的项目开发中,合理搭配使用 Lombok 注解,能够事半功倍。

• 对于实体类:若需要对象可变,可使用 @Data 加上 @Builder;若要求对象不可变,则选择 @Value,确保数据的完整性和安全性。
• 对于服务类:@Slf4j 与 @RequiredArgsConstructor 是黄金组合。前者方便日志记录,后者能够配合 Spring 框架的依赖注入,使服务类的构造和日志操作简洁又高效。

• 对于配置类:@Builder 注解能将复杂的配置参数以清晰、灵活的方式呈现,方便开发者进行配置管理和调整。
• 对于工具类:@UtilityClass 注解可以确保工具类不能被实例化,同时为其中的静态方法提供便捷的访问方式,保证工具类的正确使用和代码的整洁。

Lombok 以其出色的注解功能,极大地减少了 Java 开发中的样板代码,

让开发人员能够将更多的精力投入到核心业务逻辑的实现上。

http://www.lryc.cn/news/574734.html

相关文章:

  • order、sort、distribute和cluster by(Spark/Hive)
  • 开篇:4周的时间设计并开发一个个性化具备专业知识的东方命理师AI agent!
  • 【JavaEE】(5) 网络原理的基础认识
  • spring-security-oauth2系列:授权码授权模式
  • F5推出AI网关,赋能企业化解大模型应用风险
  • VSCode源码解析-程序的启动逻辑
  • 深度学习在智能机器人导航中的创新应用与未来趋势
  • 分布式训练中的随机种子策略:深入理解与实践指南
  • Spring Boot 切面编程(AOP)详细教程
  • 战地2042(战地风云)因安全启动(Secure Boot)无法启动的解决方案以及其他常见的启动或闪退问题
  • 3D看房实现房屋的切换
  • 五种 IO 模式的简单介绍 -- 阻塞 IO,非阻塞 IO,信号驱动 IO,IO 多路复用,异步 IO
  • Spring Data REST极速构建REST API
  • 【ArcGIS】土地资源单项评价
  • API 调试工具校验 JSON Mock 接口(二):有参验证
  • 四色(定理/猜想)染色算法小软件Version1.11 2025.6.24 开发者:孝感动天/卧冰求鲤
  • 神经网络的本质 逻辑回归 python的动态展示
  • 蓝桥杯嵌入式学习(cubemxkeil5)
  • 从零开始学习Spring Cloud Alibaba (一)
  • PYTHON从入门到实践4-数据类型
  • 大模型时代的创业机遇
  • 快速搭建企业级私有仓库:Docker + Nexus3 私服指南
  • 数据结构知识点总结--绪论
  • 02-StarRocks数据导入导出FAQ
  • 域名 SSL证书和IP SSL证书有什么区别?
  • 15:00开始面试,15:06就出来了,问的问题有点变态。。。
  • OSS大数据分析集成:MaxCompute直读OSS外部表优化查询性能(减少数据迁移的ETL成本)
  • 内存泄漏系列专题分析之二十四:内存泄漏测试Camera相机进程内存指标分布report概述
  • C++【生存游戏】开发:荒岛往事 第一期
  • 机器学习×第十三卷:集成学习上篇——她不再独断,而是召集小队贴贴你