4、Lombok最佳实践指南:团队协作规范、框架集成与常见陷阱规避

Lombok 1.18.30 实战:@Builder.Default 与构造器组合的4种模式与最佳实践 本文深入探讨了Lombok 1.18.30中@Builder.Default与构造器注解的四种组合模式,分析了它们在Java开发中的行为差异和适用场景。通过实战案例和最佳实践指南,帮助开发者解决对象构建时的默认值问题,提升代码的一致性和可维护性。特别适合使用IDEA进行Java开发的工程师参考。 阅读详情

学习目标:掌握 Lombok 在真实项目中的使用边界,学会与主流框架(Spring Boot、JPA、Jackson、MapStruct)安全集成,规避常见陷阱,并建立团队协作规范。


1. 何时该用 Lombok?何时不该用?

1.1 ✅ 推荐使用场景

场景说明示例
DTO/VO/POJO纯数据载体,无复杂逻辑UserDTO、ApiResponse
配置类@ConfigurationProperties 类DatabaseConfig
不可变值对象配合 @Value 使用Point、Money
测试实体快速构造测试数据TestUser.builder().build()
工具类日志@Slf4j 简化日志声明所有服务类

1.2 ❌ 谨慎或避免使用场景

场景风险替代方案
JPA/Hibernate 实体类@Data 可能导致 equals/hashCode 问题手动实现或仅用 @Getter/@Setter
需要自定义逻辑的类如 setter 需要参数校验手动编写 getter/setter
公共 API 模型第三方依赖可能无法识别 Lombok提供无 Lombok 的兼容版本
复杂继承体系@EqualsAndHashCode 默认忽略父类字段显式设置 callSuper = true
序列化敏感类Jackson/Gson 可能无法正确反序列化确保有无参构造器

💡 黄金法则:Lombok 适用于“数据容器”,不适用于“业务逻辑容器”。


2. 与主流框架集成注意事项

2.1 Spring Boot 集成

✅ 正确做法
// 配置类:完美适用
@Data
@ConfigurationProperties(prefix = "app.database")
public class DatabaseProperties {
    private String url;
    private String username;
    private String password;
}

// 服务类:构造器注入推荐
@Service
@RequiredArgsConstructor
public class UserService {
    private final UserRepository userRepository; // final 字段
}
⚠️ 注意事项
  • 避免在 @Component 类上使用 @Data:可能生成不必要的 equals/hashCode
  • 构造器注入优先:使用 @RequiredArgsConstructor 替代 @Autowired

2.2 JPA / Hibernate 实体类

❌ 危险用法
// 千万不要这样写!
@Data
@Entity
public class User {
    @Id
    private Long id;
    private String name;
    // ...
}

问题:

  1. @Data 生成的 equals/hashCode 基于所有字段,包括未加载的懒加载字段
  2. 可能导致 LazyInitializationException
  3. 实体状态变化时,hashCode 可能改变,破坏 HashSet 行为
✅ 安全做法
@Entity
@Table(name = "users")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString(exclude = "orders") // 排除关联集合
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    private String email;
    
    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private List<Order> orders = new ArrayList<>();
    
    // 手动实现 equals/hashCode,仅基于业务键(如 id)
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof User)) return false;
        User user = (User) o;
        return Objects.equals(id, user.id);
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}

🔑 JPA 实体最佳实践:

  • equals/hashCode 只基于 @Id 字段
  • 避免在 toString() 中包含懒加载集合
  • 必须提供无参构造器(JPA 要求)

2.3 Jackson / JSON 序列化

✅ 正确配置
// DTO 类:完美适用
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserResponse {
    private Long id;
    private String username;
    private String email;
}
⚠️ 常见问题与解决

问题1:反序列化失败(缺少无参构造器)

// 错误:只有 @Data,没有无参构造器
@Data
public class UserRequest {
    private String username;
    private String password;
}

解决:

@Data
@NoArgsConstructor // 必须添加!
@AllArgsConstructor
public class UserRequest {
    // ...
}

问题2:循环引用导致 StackOverflow

// User 和 Order 相互引用
@Data
public class User {
    private List<Order> orders;
}

@Data
public class Order {
    private User user;
}

解决:

@Data
public class User {
    @ToString.Exclude // Lombok 层面排除
    @JsonIgnore      // Jackson 层面排除
    private List<Order> orders;
}

@Data
public class Order {
    @ToString.Exclude
    @JsonIgnore
    private User user;
}

2.4 MapStruct 集成

MapStruct 是编译期代码生成器,与 Lombok 都在编译期工作,需要正确配置顺序。

Maven 配置
<dependencies>
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-configuration-processor</artifactId>
    	<optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>1.6.3</version>
    </dependency>
    <dependency>
    	<groupId>org.mapstruct</groupId>
    	<artifactId>mapstruct-processor</artifactId>
    	<version>1.6.3</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-configuration-processor</artifactId>
                    </path>
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                    </path>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>
Gradle 配置
dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.30'
    annotationProcessor 'org.projectlombok:lombok:1.18.30'
    
    implementation 'org.mapstruct:mapstruct:1.5.5.Final'
    annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'
}

🔑 关键点:Lombok 必须在 MapStruct 之前处理,这样 MapStruct 才能看到 Lombok 生成的 getter/setter。


3. 调试技巧:如何查看 Lombok 生成的代码?

3.1 IntelliJ IDEA 反编译查看

  1. 编译项目:Build → Build Project
  2. 在 target/classes(Maven)或 build/classes(Gradle)中找到 .class 文件
  3. 双击打开,IDEA 会自动反编译显示 Java 代码
  4. 查看实际生成的 getter/setter/toString 等方法

3.2 使用 Delombok 工具

Lombok 提供 delombok 命令,将注解转换为实际代码:

# Maven 插件方式
mvn lombok:delombok

# 生成的代码会放在 target/generated-sources/delombok/

Gradle 配置 delombok:

task delombok(type: JavaExec) {
    mainClass = 'lombok.launch.Main'
    args = ['delombok', 'src/main/java', '-d', 'build/delombok']
    classpath = configurations.compileClasspath
}

3.3 调试时的断点设置

  • 可以在生成的方法中设置断点!IDEA 能正确识别
  • 如果断点不生效,检查:
    • Lombok 插件是否安装
    • Annotation Processing 是否启用
    • 项目是否正确编译

4. 团队协作规范

4.1 插件管理

强制要求:所有团队成员必须安装 Lombok 插件

解决方案:

  • 在项目 README 中明确说明安装步骤
  • 使用 .editorconfig 或 IDE 配置文件提示
  • CI/CD 流程中验证编译通过(确保依赖配置正确)

4.2 版本管理

统一 Lombok 版本,避免兼容性问题:

Maven - 使用 dependencyManagement:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Gradle - 使用 ext 或 plugins:

ext {
    lombokVersion = '1.18.30'
}

dependencies {
    compileOnly "org.projectlombok:lombok:$lombokVersion"
    annotationProcessor "org.projectlombok:lombok:$lombokVersion"
}

4.3 代码审查清单

在 Code Review 时检查:

  • 是否在 JPA 实体上误用了 @Data?
  • 敏感字段是否在 @ToString 中排除?
  • 是否为 Jackson DTO 提供了无参构造器?
  • equals/hashCode 实现是否合理(特别是继承场景)?
  • @SneakyThrows 是否用于合适的场景?

5. 常见陷阱与解决方案

5.1 继承问题

问题:子类使用 @EqualsAndHashCode,但父类字段未参与比较

错误示例:

@Data
public class Animal {
    private String name;
}

@Data
public class Dog extends Animal {
    private String breed;
}

风险:两个 Dog 对象,name 相同但 breed 不同,可能被认为相等

解决方案:

@Data
public class Animal {
    private String name;
}

@EqualsAndHashCode(callSuper = true) // 关键!
@ToString(callSuper = true)
public class Dog extends Animal {
    private String breed;
}

5.2 序列化问题

问题:Lombok 生成的类在某些序列化框架中无法正确反序列化

解决方案:

  • 始终为 DTO 提供无参构造器:@NoArgsConstructor
  • 避免在 final 字段上使用 @Setter
  • 测试序列化/反序列化流程

5.3 IDE 与构建工具不一致

现象:IDE 中正常,但命令行编译失败

原因:构建工具缺少 annotationProcessor 配置

解决:

  • Maven:确保依赖 scope 为 provided
  • Gradle:同时配置 compileOnly 和 annotationProcessor
  • 验证:始终在命令行测试 mvn clean compile 或 ./gradlew build

5.4 性能误解

误区:Lombok 会影响运行时性能

事实:Lombok 只在编译期工作,生成的字节码与手写代码完全相同,零运行时开销。


6. 团队 Lombok 使用规范模板

# Lombok 使用规范

## 允许使用
- DTO/VO/POJO 类:`@Data` + `@NoArgsConstructor`
- 配置类:`@Data` + `@ConfigurationProperties`
- 不可变对象:`@Value`
- 服务类日志:`@Slf4j`

## 禁止使用
- JPA/Hibernate 实体类上使用 `@Data`
- 需要自定义 getter/setter 逻辑的类
- 公共 API 的模型类(对外 jar 包)

## 必须遵守
- 敏感字段必须在 `@ToString` 中排除
- JPA 实体必须手动实现 `equals/hashCode`(仅基于 ID)
- 所有团队成员必须安装 Lombok 插件
- 统一使用 Lombok 版本:1.18.30

7. 小结

✅ 你已掌握:

  • 使用边界:知道何时用、何时不用 Lombok
  • 框架集成:与 Spring Boot、JPA、Jackson、MapStruct 的安全集成方式
  • 调试技巧:通过反编译和 delombok 查看生成代码
  • 团队规范:插件管理、版本控制、代码审查要点
  • 陷阱规避:继承、序列化、IDE/构建不一致等问题的解决方案

➡️ 下一步:进入 05-Lombok原理深入剖析,了解 Lombok 背后的编译期注解处理机制!

💡 终极建议:

  • 在简单场景大胆使用:DTO、配置类等
  • 在复杂场景保持谨慎:实体类、继承体系等
  • 团队共识最重要:建立规范并严格执行
Lombok的@Accessors(chain = true)在Java开发中的潜在陷阱与规避策略 本文深入剖析了Lombok的@Accessors(chain = true)注解在Java开发中带来的便利与潜在风险。虽然链式Setter能提升代码的简洁性与流畅度,但它可能引发多线程安全、与不可变对象设计冲突、继承体系类型混乱以及与部分框架兼容性等问题。文章通过实际案例,提供了使用@Builder替代、制定项目规范等规避策略,帮助开发者安全、合理地运用此特性。 阅读详情

相关推荐

Java编码规范与性能优化实战指南

Java作为主流的面向对象编程语言,其编码规范直接影响程序的性能、可维护性和安全性。从JVM内存管理到多线程并发控制,良好的编码习惯能显著提升系统稳定性。本文重点解析字符串处理、集合框架、异常处理等核心场景中的性能陷阱,例如StringBuilder比直接拼接效率高200倍,基本类型比包装类快5倍等关键数据。通过剖析自动装箱、集合初始化容量、try-with-resources等典型case,帮助开发者规避内存泄漏、并发修改异常等常见问题。这些规范在电商秒杀、金融交易等高并发场景中尤为重要,是构建高性能Ja

weixin_33861800的博客 361

Lombok @Data 在若依框架下的陷阱分析!

它是“提高效率的加速器”,也是“隐患的放大镜”。

m0_60456028的博客 373

Lombok编译期代码生成原理与Java开发提效实践

Lombok是一种基于JSR-269注解处理器规范的编译期代码生成工具,它在javac编译阶段动态注入getter/setter/toString/equals/hashCode等模板代码,不依赖反射、不增加运行时开销,显著降低Java样板代码(boiler plate code)编写量。其核心价值在于提升开发效率与代码一致性,广泛应用于Spring Boot、Maven/Gradle构建的Java 8+项目中,尤其适合DTO、VO、Entity等数据载体类的快速建模。通过@Data、@Builder、@S

diankui6178的博客 403

Lombok在Java开发中的高效应用与最佳实践

Lombok是一个Java库,通过注解在编译时自动生成代码,显著减少样板代码量。其核心原理是利用注解处理器修改抽象语法树(AST),在编译阶段动态生成getter/setter等方法。这种技术特别适合Java企业级开发,能提升代码整洁度和维护效率。在Spring Boot、JPA等框架中,Lombok可以与@Data、@Builder等注解配合使用,优化实体类、DTO的编写。但需注意避免常见陷阱,如循环引用和性能问题。合理使用Lombok注解,结合SLF4J日志等工具,能大幅提升开发体验和代码质量。

477

Lombok的@Accessors(chain=true)在Spring Boot项目中的5个实际坑点

本文深入剖析了Lombok的@Accessors(chain=true)在Spring Boot项目中的5个实际坑点,包括Jackson反序列化异常、JPA懒加载失效、单元测试虚假通过等问题。通过具体案例和解决方案,帮助开发者避免链式调用在Spring生态中的潜在风险,提升代码可靠性。

weixin_30872499的博客 404

Lombok原理与工程实践:Java注解处理器深度解析

Java注解处理器(Annotation Processor)是JVM生态中实现编译期代码增强的核心机制,其基于JSR-269标准,在javac编译流程的AST构建后、字节码生成前介入,通过修改抽象语法树完成getter/setter生成、Builder类注入等能力。这种编译期代码注入不改变运行时行为,保障调试可见性与字节码兼容性,技术价值在于显著降低样板代码(boiler plate code)冗余、释放开发者认知带宽。典型应用场景包括DTO/VO类简化、Spring构造器注入适配、Records扩展增强

weixin_30627341的博客 316

Java开发中的常见陷阱与规避策略

利用`String.join()`或`String.format()`- 使用`StringBuilder`或`StringBuffer`- 陷阱:将可变对象(如ArrayList)用作HashMap的键。- 通过注解(如`@NonNull`)配合静态分析工具检测。- 陷阱:未同时重写hashCode()和equals()。- 使用try-with-resources语法。- 使用Lombok的`@Cleanup`注解。- 注意包装类的缓存范围(-128~127)

rMbdRvbJ的博客 392

Claude Opus 4.6实战:AI编码助手的工程化落地与避坑指南

AI编码助手正从‘智能补全’迈向‘结对编程’新阶段,其核心在于模型能力、交互范式与工程语境的深度协同。Claude Opus 4.6凭借200K上下文与多跳推理优势,在长逻辑链、跨文件依赖理解上显著提升,但真实落地需直面技术栈适配、领域规范对齐与隐性知识显性化等关键挑战。本文聚焦Java/TypeScript全栈场景,解析如何通过结构化提示、分层上下文管理、人工校验检查点等工程化手段,将Claude Code转化为可控、可追溯、可维护的开发闭环。特别涵盖Lombok契约冲突、MyBatis命名规范错位、日志

a4512138的专栏 491

Lombok编译期原理与工程实践:AST注入、IDE集成与CI/CD避坑指南

Java注解处理器(JSR 269)是实现编译期代码生成的核心机制,其通过在javac的AST构建阶段介入,动态修改抽象语法树,从而在不改变字节码的前提下增强源码语义。Lombok正是基于该标准机制,在编译流程中完成getter/setter/equals/toString等契约方法的自动注入,具备零运行时开销、IDE友好、调试可达等工程优势。其技术价值在于将重复性模板逻辑从开发者心智负担中剥离,交由编译器统一保障一致性。典型应用场景覆盖JavaBean规范实现、DTO/Entity分层建模、不可变对象构建

weixin_33858485的博客 339

Spring Boot项目里用Lombok的@AllArgsConstructor,怎么避免循环依赖报错?

本文深入探讨了在Spring Boot项目中使用Lombok的@AllArgsConstructor注解时如何避免循环依赖报错的问题。通过分析循环依赖的本质和@AllArgsConstructor的特殊性,提供了五种实战解决方案,包括改用@RequiredArgsConstructor、调整Bean加载顺序、接口抽象与设计模式重构等,帮助开发者优雅地规避循环依赖陷阱。

weixin_30580341的博客 219

Java开发中@Data注解的深度解析:原理、实战与避坑指南

在Java企业级开发中,代码的简洁性和可维护性是提升开发效率的关键。通过编译时注解处理器,开发者可以自动生成常见的样板代码,这一技术原理在Lombok项目中得到了广泛应用。其核心价值在于减少重复劳动,让开发者更专注于业务逻辑实现,从而提升工程实践效率。在Spring Boot等框架中,这种技术广泛应用于实体类、DTO、配置属性绑定等场景,能够显著简化模型类的定义。本文聚焦于Lombok的@Data注解,深入探讨其如何自动生成getter、setter、equals、hashCode和toString方法,并

cuemes08808的博客 628

解决 Apache Dubbo 中 Lombok @ToString 注解导致的递归问题:完整解决方案

在使用 Apache Dubbo 进行分布式服务开发时,Lombok 的 @ToString 注解虽然能简化代码,但可能引发隐蔽的递归调用问题,导致 StackOverflowError。本文将详细介绍如何识别、分析并彻底解决这一常见问题,帮助开发者构建更健壮的 Dubbo 服务。 ## 问题表现:隐蔽的递归陷阱 ⚠️ 当在 Dubbo 服务接口或实体类上使用 `@ToString` 注解时,

gitblog_00399的博客 510

别再手动写JPA实体了!用JPA Buddy插件5分钟搞定Spring Boot数据层开发(附Lombok避坑技巧)

本文介绍了如何使用JPA Buddy插件快速完成Spring Boot数据层开发,包括JPA实体、Repository和DTO的自动生成,以及Lombok在JPA实体中的常见陷阱与解决方案。通过可视化设计和智能代码生成,开发者可以大幅提升效率,避免手动编写样板代码。

weixin_30412167的博客 507

Mybatis反射异常深度剖析:从‘There is no getter’看属性映射的三大陷阱与规避策略

本文深度剖析Mybatis反射异常'There is no getter'的根源,揭示属性映射中的三大常见陷阱:裸奔的DTO属性、XML中的冗余修饰以及驼峰与下划线命名冲突。通过具体案例和解决方案,帮助开发者规避这些坑,提升Mybatis使用效率和代码健壮性。

weixin_30291791的博客 373

避坑指南:PyCINRAD处理CINRAD雷达数据时遇到的5个典型报错及解决方案

本文针对使用PyCINRAD库处理CINRAD雷达基数据时常见的5个典型报错,提供了详细的解决方案。内容涵盖环境配置、数据读取、PPI可视化及性能优化等核心环节,重点解决了版本兼容性、数据异常处理和中文乱码等实际问题,帮助用户高效处理雷达基数据并生成准确的PPI图像。

cc789的博客 1067

C#中使用OpenCV的常用函数

c# opencv 常见操作

大黄鸭在发光的专栏 1078

Spring Boot 中 Lombok EqualsAndHashCode用法介绍

是 Lombok 提供的强大注解,能显著减少手动编写equals和hashCode的工作量。在 Spring Boot 项目中使用时,应特别注意:在 JPA 实体中排除关联字段,避免循环依赖和懒加载异常。结合和明确参与比较的字段。合理使用callSuper处理继承关系。关注字段可变性对集合行为的影响。正确使用可以让代码更简洁、更安全,提升开发效率。

BillKu的博客 450

基于QEMU的openEuler aarch64虚拟机快速部署与漏洞验证指南

本文提供了一份基于QEMU在个人电脑上快速部署openEuler aarch64虚拟机的详细指南。内容涵盖从软件准备、目录规划、QEMU安装、虚拟磁盘创建到系统安装与SSH配置的全过程,并以CVE-2024-1086内核漏洞为例,演示了如何在该虚拟环境中进行安全漏洞的验证与补丁测试,为安全研究和运维测试提供了一个低成本、高效率的ARM架构沙箱环境。

earth的博客 438

AI编程工具如何支撑团队协作:规范即代码的实践指南

AI编程工具已从个人效率辅助升级为团队协作基础设施。其核心价值在于将抽象的开发规范转化为可执行、可校验、可继承的工程能力——这正是‘规范即代码’(Code-as-Rules)范式的本质。借助规则引擎、项目级语义理解与知识建模,AI不再仅补全语法,而是保障架构一致性、降低新人认知负荷、自动消解风格冲突。Trae等新一代工具通过`.trae/rules`实现编译期规范拦截,GitHub Copilot Enterprise依托团队提示词同步提升审查效率,而Windsurf与JetBrains AI Assist

weixin_34013044的博客 320

智能排班考勤系统原型

可实现从业务预测,到工时预估,再到人员分配全流程自动智能排班。可应用于客服行业或工厂的智能排班系统。

gywm15111336483的专栏 989

Python 爬虫实战:在丁香医生抓取健康科普文章阅读量,普及健康知识

requests:用于发送 HTTP 请求,获取网页内容。或 lxml:用于解析 HTML 页面,提取目标数据。pandas:用于数据清洗和分析。matplotlib和seaborn:用于数据可视化。通过本项目,我们实现了以下目标:使用 Python 爬虫抓取丁香医生的健康科普文章阅读量。对数据进行清洗和分析,找出热门文章。通过可视化展示数据,并普及健康知识。

u014481728的博客 1566

从 0 到 1 构建企业级 Spring Boot 应用:核心实战与最佳实践

Spring Boot 开发的核心是 “简洁” 与 “规范”:通过合理的项目结构、统一的通用能力(异常、返回值、文档)、完善的性能优化和运维保障,才能构建出符合企业级标准的应用。本文覆盖的实战要点可直接落地到生产项目,后续可进一步扩展 Spring Cloud 微服务、消息队列、分布式事务等高级特性。

2502_91815941的博客 961

Qt C++ 卫星数据接收与处理界面

打开 `MainWindow.ui`,你会发现我们完全是在代码中 (`setupUI`) 创建的 UI。* 访问 [QCustomPlot 官网](https://www.qcustomplot.com/) 下载最新版本的 `qcustomplot.h` 和 `qcustomplot.cpp` 文件。* 对于 FFT,可以使用专门的库如 [FFTW](http://www.fftw.org/),或者 Qt 5.15 及以上版本中提供的 `QFFT` 和 `QComplex` 类。

寒寒豆豆软件公司的博客 148

Spring 依赖注入:官方推荐方式及最佳实践

本文深入分析Spring三大依赖注入方式的优缺点,指出字段注入会破坏不可变性、隐藏依赖关系且难以测试,Setter注入存在部分初始化风险,而构造器注入作为官方推荐方式,能确保完全初始化、支持不可变字段、明确依赖关系并简化测试。最佳实践建议优先使用构造器注入,配合Lombok简化代码,仅在特殊场景使用Setter注入,避免字段注入。正确的依赖注入方式选择将显著提升代码健壮性、可维护性和可测试性。

体系化很难,碎片归纳很简单。 1229

华为OD机试 新系统真题-收集灵草(Java/Py/C++/Go/C/Js)

华为OD机试 新系统真题【收集灵草】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【收集灵草】多语言题解。

qq_45776114的博客 544

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: 3、Lombok进阶功能实战:Builder模式、异常处理与资源管理高级用法
下一篇: 5、Lombok原理深入剖析:编译期注解处理机制与替代方案对比
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值