基于条件的lombok建筑物

时间:2018-01-30 11:28:56

标签: java dropwizard builder lombok

所以这里是用于构建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

2 个答案:

答案 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 ,因为它使代码更加更清洁

希望这有帮助。

相关问题