带有@Builder.Default的Java记录

问题描述 投票:0回答:3

我想知道有没有什么办法可以将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")
) {}

编译器将因错误而失败,表明不允许使用此类语法。我们有解决这个问题的方法吗?

java lombok
3个回答
4
投票

如果你想做的不仅仅是在容器中记录值,就不要使用 recorde。在这种情况下,你不应该使用 recorde,因为它不允许你指示一些不同的东西然后简单地记录你的论点。

如果你想为你正在创建的这个类的任何实例设置一个默认值,你需要一个“普通”构造函数。

这就是为什么你不能在记录中(再次)设置值。


1
投票

此功能目前不可用。请检查问题下的第一条评论

现在还没有,我在将@Builder 的支持扩展到记录时没有考虑到这一点。


0
投票

您可以通过使用 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]
© www.soinside.com 2019 - 2024. All rights reserved.