基于条件的 lombok 对象构建

Noo*_*tor 4 java builder lombok dropwizard

所以这是为构建Humans编写的现有代码片段(如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();    
}
Run Code Online (Sandbox Code Playgroud)

如果你看一下,这段代码在属性分配中有很多冗余,可以最小化。现在想象一下 10 个类似的条件(这里,只有 2 个!),无论您尝试什么,它最终都会导致看起来很丑的冗余代码。

我尝试在网上搜索大量资源,但找不到任何按照 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();
Run Code Online (Sandbox Code Playgroud)

这是否可以通过 lombok 或任何人知道在这里构建对象的更好方法?
如果它值得,我在drop-wizard

Dmi*_*ets 5

使用 Lombok 的 Builder:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

Human(name=abcd, gender=female, speaks=english, alive=true)
Run Code Online (Sandbox Code Playgroud)