当前位置: 首页 > 知识库问答 >
问题:

在方法级别上使用Lombok@Builder时提供默认值?

苗征
2023-03-14
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class RegistrationRequest {

    private String email;
    private String emailRepeat;
    private String password;
    private String passwordRepeat;
}
java prettyprint-override">public class SomeTestUtils {

    public static final String DEFAULT_EMAIL = "foo@bar.com";
    public static final String DEFAULT_EMAIL_REPEAT = "foo@bar.com";
    public static final String DEFAULT_PASSWORD = "my-password";
    public static final String DEFAULT_PASSWORD_REPEAT = "my-password";

    @Builder(builderMethodName = "aRegistrationRequest", setterPrefix = "with")
    public static RegistrationRequest buildRegistrationRequest(String email, String emailRepeat, String password, String passwordRepeat) {
        final RegistrationRequest request = new RegistrationRequest();
        request.setEmail(email);
        request.setEmailRepeat(emailRepeat);
        request.setPasswort(password);     
        return request;
    }
}
SomeTestUtils.aRegistrationRequest()
  .withEmail("foo@bar.com")
  .withEmailRepeat("foo@bar.com")
  .withPassword("my-password")
  .withPasswordRepeat("my-password")
.build();

但是现在我想为任何未显式设置的字段提供默认值。因此,如果我这样做了,那么将创建一个具有所有默认值的对象:

SomeTestUtils.aRegistrationRequest().build();

共有1个答案

西门淮晨
2023-03-14

Lombok开发人员:

你不能,不是直接的。在lombok完成它的任务之前,代码需要是语法上有效的java,而且没有一种可行的方法(至少,我们从未想出可以接受的方法)来用java语法编写您想要的内容。这些事情根本行不通:

/* 1 */ void foo(int param = 5) {}
/* 2 */ void foo(@DefaultValue(5) int param) {}
/* 3 */ void foo(@DefaultValue("5") int param) {}
/* 4 */ void foo(int param) {
  defaultValues: {
    param = 5;
  }
}
  1. 这根本就不会解析。Javac出现语法错误而失败,lombok甚至没有被调用。我们不能这样做。
  2. 注释参数需要特定的类型--您不能定义一个带有类型为“whather”的参数的注释。我们可以创建@IntDefaultValue@StringDefaultValue等,但是[A]只允许您涵盖这些类型的原语、字符串、值、枚举和数组,而不包括其他内容,[B]意味着您只能提供编译时常量。这限制太大了。
  3. 这是“有效的”,但是把实际的java代码塞进字符串文本是非常难看的,我们不打算把它添加到Lombok中。
  4. 这是最接近可行的,但您不可能记住必须完全这样写,而且涂布工具会对此感到相当困惑。它还与许多java程序员在每个参数中添加final的烦人习惯相冲突(如果您是这样的人,我建议您不要这样做。如果您讨厌变异params,请添加一个linting或IDE规则来防止它,并从代码中删除这些杂乱)。输入DefaultValues:参数也很容易,您将获得零个自动完成帮助。
@Builder void foo(Integer x) {
  if (x == null) x = 5;
  // carry on with the code as normal
}
@Builder void foo(Integer paramIn) {
  int param == paramIn == null ? 5 : paramIn;
  // carry on as normal. Woe is you if you use paramIn.
}
 类似资料:
  • 我正在使用龙目岛的建设者。将默认值分配给我试图使用的一些变量 @建筑商。违约 但问题是,在使用上述注释时,我不再能够通过生成器初始化该值,因为编译器在尝试通过生成器初始化变量时说无法解析方法。 所以,本质上我要寻找的是一种设置默认值的方法,并且在通过构建器启动时仍然能够覆盖。

  • 我想有一种简单的方法来构建测试数据,并发现生成器模式非常适合这里描述的情况。然而,为了减少组件测试中的样板代码,甚至更多,我发现来自龙目岛项目的@Builder是一个很好的候选人。然而,我找不到任何关于如何在方法上使用它的留档或在线示例。我想在某种工厂方法上使用,因为我不能对实现进行任何更改。 有人能举例说明如何在方法上实际使用?

  • 问题内容: 我正在将Lombok项目与Spring Data JPA一起使用。有什么方法可以将Lombok 与JPA默认构造函数连接? 码: 据我所知,JPA需要默认的构造函数,该构造函数被注解覆盖。有什么解决方法吗? 这段代码给我错误: 问题答案: 更新 根据反馈和John的回答,我已更新了不再使用or的答案,而是通过和创建访问器和变量,通过创建默认构造函数via,最后我们创建了构建器通过via

  • 我使用默认构造函数从子类中设置recordId的值,最初没有使用lombok。最终我决定在这里使用构建器,但现在的问题是lombok构建器在内部覆盖了我的默认构建器,因此从未设置值。

  • 我正在使用lombok@Builder。当我将注释放在类上时,生成公共方法。但是我想创建私有的方法。不幸的是,注释没有选项。我该怎么办?

  • 我使用的是IntelliJ14,而我的机器已经安装了JDK7。然而,每次创建新的项目,语言水平是5。 虽然我可以通过转到项目设置->项目->项目语言级别和项目设置->模块->[模块名称]->源->语言级别来进行更改,但是对于每个项目都需要时间来做那件事。 IntelliJ是否可以自动检测我的JDK并选择正确的默认语言级别,或者有一个默认的语言级别设置?