Java作为一种编程语言,已经发展了多年,引入了新的功能和改进来提高开发人员的工作效率和代码可读性。随着Java 14的发布,一个显著的特性是引入记录作为语言功能,提供了一种定义不可变数据承载类的简洁方法。
如果您一直在使用Lombok来减少Java类中的样板代码,那么值得考虑迁移到records以获得更本地和标准化的方法。
在本文中,我们将使用实际的例子来探索使用Lombok将Java代码迁移到Java记录的过程。
为什么从Lombok迁移到Records?
龙目岛已经在Java社区中被广泛采用,因为它能够通过自动生成getters、setters、constructors和其他重复代码来减少冗长的内容。虽然Lombok很有效,但记录的引入为定义不可变数据类提供了一个标准化的内置解决方案。记录提供与语言的更好集成,并由各种工具和框架提供本地支持。
迁移Getters和Setters
龙目岛示例
import lombok.Data;
@Data
public class Movie {
private String title;
private int releaseYear;
}
记录示例
public record Movie(String title, int releaseYear) {
}
在记录示例中,我们定义了一个电影用两个字段初始化(标题和发布年份)放在构造函数参数列表中。编译器自动生成构造函数,等于(), 哈希码(),以及托字符串()方法,类似于Lombok生成的方法。
迁移构造函数
龙目岛示例
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
public class Series {
private String title;
private int startYear;
private int endYear;
}
记录示例
public record Series(String title, int startYear, int endYear) {
}
记录会自动生成一个紧凑且富有表现力的构造函数来初始化所有字段。在……里系列记录示例中,构造函数接受与字段对应的三个参数标题, 开始年份,以及年末.
不可变的记录
龙目岛示例
import lombok.Value;
@Value
public class Actor {
private String name;
private int birthYear;
}
记录示例
public record Actor(String name, int birthYear) {
}
记录固有地提供了不变性,因为所有字段都标记为最后的默认情况下。在的记录示例中演员类名字和出生年份字段是不可变的,并且不会生成任何设置器。
处理默认值
有时,有必要处理某些字段的默认值。在龙目岛,这可以通过使用@Builder或自定义方法。对于记录,默认值可以直接在构造函数中设置。
龙目岛示例
import lombok.Builder;
@Builder
public class Film {
private String title;
private String director;
private int releaseYear;
}
记录示例
public record Film(String title, String director, int releaseYear) {
public Film {
if (Objects.isNull(title)) {
this.title = "Unknown Title";
}
if (Objects.isNull(director)) {
this.director = "Unknown Director";
}
}
}
在的记录示例中电影类中,默认值直接在构造函数体中设置。如果标题或者主管是空,将分配默认值。
在Lombok中使用构建器
import lombok.Builder;
@Builder
public class FilmWithLombok {
private String title;
private String director;
private int releaseYear;
}
// Example of using the builder:
FilmWithLombok film = FilmWithLombok
.builder()
.title("Inception")
.director("Christopher Nolan")
.releaseYear(2010)
.build();
在龙目岛的例子中@Builder注释为FilmWithLombok班级。构建器提供了一个fluent API,用于使用可选和可链接的setter方法构建实例。
使用带有Java记录的构建器
public record FilmWithRecord(String title, String director, int releaseYear) {
public static class Builder {
private String title;
private String director;
private int releaseYear;
public Builder title(String title) {
this.title = title;
return this;
}
public Builder director(String director) {
this.director = director;
return this;
}
public Builder releaseYear(int releaseYear) {
this.releaseYear = releaseYear;
return this;
}
public FilmWithRecord build() {
return new FilmWithRecord(title, director, releaseYear);
}
}
}
// Example of using the builder:
FilmWithRecord film = new FilmWithRecord
.Builder()
.title("The Dark Knight")
.director("Christopher Nolan")
.releaseYear(2008)
.build();
对于Java记录,我们创建一个静态嵌套的建设者记录中的类。生成器类具有设置每个字段的方法和一个建设方法创建记录的实例。这提供了一个类似于Lombok示例中的fluent API。
使用带有记录的构建器或Lombok提供了一种方便且可读的方法来构建实例,尤其是在处理具有多个字段的类时。选择符合您的偏好和项目要求的方法。
结论
从Lombok迁移到Java记录是利用本机语言特性提高代码可维护性和可读性的一步。
记录提供了一种标准化和简洁的方法来定义不可变的数据类,从而消除了对Lombok等附加库的需求。通过遵循本文中提供的示例,开发人员可以无缝地转换他们的代码,以受益于Java 14+中最新的语言特性。记得相应地更新您的构建配置和依赖项,并享受Java记录提供的增强的表达能力和简单性。