我想知道有没有什么办法可以将java record和lombok的
@Builder.Default
结合起来?
让我们考虑一个用于创建新文件的属性对象的示例。
Java 14 之前
@Value
@Builder
public class FileProperties {
@Builder.Default
String directory = System.getProperty("user.home");
@Builder.Default
String name = "New file";
@Builder.Default
String extension = ".txt";
}
Java 14
@Builder
public record FileProperties (
String directory,
String name,
String extension
) {}
但是万一我尝试使用类似的东西
@Builder
public record FileProperties (
@Builder.Default
String directory = System.getProperty("user.home")
) {}
编译器将因错误而失败,表明不允许使用此类语法。我们有解决这个问题的方法吗?
如果你想做的不仅仅是在容器中记录值,就不要使用 recorde。在这种情况下,你不应该使用 recorde,因为它不允许你指示一些不同的东西然后简单地记录你的论点。
如果你想为你正在创建的这个类的任何实例设置一个默认值,你需要一个“普通”构造函数。
这就是为什么你不能在记录中(再次)设置值。
此功能目前不可用。请检查问题下的第一条评论
现在还没有,我在将@Builder 的支持扩展到记录时没有考虑到这一点。
您可以通过使用 Lombok 的默认值定义构建器本身来实现相同的结果,而不是
@Builder.Default
:
@Builder
public record FileProperties (
String directory,
String name,
String extension
) {
public static class FilePropertiesBuilder {
private String directory = System.getProperty("user.home");
private String name = "New file";
private String extension = ".txt";
}
}
然后进行测试:
public static void main(String[] args) {
System.out.println(FileProperties.builder().build());
}
输出:
FileProperties[directory=/home/me, name=New file, extension=.txt]