首页 > 解决方案 > 是否可以使用 Lombok 自动化函数重载?

问题描述

我很好奇是否可以使用 Lombok 缩短函数重载。基本上我想缩短这个。

public setUserDetails() {
    setUserDetails(null, null, null, null);
}

public setUserDetails(String firstName) {
    setUserDetails(firstName, null, null, null);
}

public setUserDetails(String firstName, String lastName) {
    setUserDetails(firstName, lastName, null, null);
}

public setUserDetails(String firstName, String lastName, String address) {
    setUserDetails(firstName, lastName, address, null);
}

public setUserDetails(String firstName, String lastName, String address, String phoneNumber) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.address = address;
    this.phoneNumber = phoneNumber;
}

变成这样的东西:

@CreateFunctionOverloads
public setUserDetails(String firstName, String lastName, String address, String phoneNumber) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.address = address;
    this.phoneNumber = phoneNumber;
}

标签: javalombok

解决方案


不,但是您的 API 看起来使用起来很容易出错,所以这也许是件好事。

5个参数都是字符串的问题是我可以这样调用它,它会编译得很好

foo.setUserDetails("Smith", "Michael", "address", "phoneNum");

你看到问题了吗?

我切换了第一个和第二个参数

这是你会花费数小时尝试调试的事情,当你最终意识到时,你会觉得自己像个白痴。我知道,因为它发生在我身上。

所以我会放弃你的想法。有更好的方法来创建带有可选字段的对象。

您可以使用@Withwhich 创建对象的新不可变副本

new User().withFirstName("Michael").withLastName("Smith")

或者您可以使用@Builderwhich 创建单个可变构建器实例,然后在调用build.

User.builder().firstName("Michael").lastName("Smith").build()

推荐阅读