所以这里是用于构建Human
的现有代码片段(如matrix
电影:) :)
if (gender.equals("male")){
return Human.builder()
.gender('male')
.name('abc')
.speaks("english")
.alive(true)
.build();
}else{
return Human.builder()
.gender('female')
.name('abcd')
.speaks("english")
.alive(true)
.build();
}
如果你看一下,这段代码在属性赋值中有很多冗余,可以最小化。现在想象一下这样的10个条件(这里,它只是2!),无论你尝试什么,它最终都会导致丑陋的冗余代码。
我尝试在线搜索大量资源,找不到任何方法来构建对象per builder design。我想在这里实现的目标(减少代码冗余)如下所示:
Human human = Human.builder()
.speaks("english")
.alive(true);
if (gender.equals("male")){
human = human // or just human.gender('male').name('abc'); no assignment
.gender('male')
.name('abc');
}else{
human = human // or just human.gender('female').name('abcd'); no assignment
.gender('female')
.name('abcd');
}
return human.build();
这可能是通过lombok或任何人都知道更好的方法来构建对象吗?
如果它值得,我在drop-wizard
答案 0 :(得分:1)
使用Lombok的构建器:
import lombok.Builder;
import lombok.ToString;
@Builder
@ToString
public class Human {
private String name;
private String gender;
private String speaks;
private boolean alive;
public static void main(String[] args) {
HumanBuilder humanBuilder = Human.builder();
String gender = "female";
humanBuilder
.speaks("english")
.alive(true);
if("male".equals(gender)){
humanBuilder
.gender("male")
.name("abc");
}else{
humanBuilder
.gender("female")
.name("abcd");
}
Human human = humanBuilder.build();
System.out.println(human);
}
}
结果:
Human(name=abcd, gender=female, speaks=english, alive=true)
答案 1 :(得分:1)
您可以使用以下任何一种方法来消除代码冗余并提供清晰度:
选项1:
Human human = Human.builder()
.gender(gender.equals("M")?"male":(gender.equals("F")?"female":"transgender"))
.name("abc")
.speaks("english")
.alive(true)
.address(Optional.ofNullable(address).orElse(defaultAddress))
.build();
选项2:
Human human = Human.builder()
.gender(getGender(gender))
.name("abc")
.speaks("english")
.alive(true)
.address(Optional.ofNullable(address).orElse(defaultAddress))
.build();
public static String getGender(String gender){
return gender.equals("M")?"male":(gender.equals("F")?"female":"transgender");
}
选项3:
Human.HumanBuilder humanBuilder = Human.builder();
humanBuilder.name("abc").speaks("english").alive(true);
if(gender.equals("M")){
humanBuilder.gender("male");
}else {
humanBuilder.gender("female");
}
Human human = humanBuilder.build();
我的个人偏好是选项2 ,因为它使代码更加更清洁。
希望这有帮助。