Создайте общий построитель для объекта независимо от полей, передаваемых в - PullRequest
0 голосов
/ 23 мая 2018

У меня есть класс с несколькими полями:

@Builder
public class SampleClass {
    private String a;
    private String b;
    private String c;
    private String d;
}

У меня есть вспомогательный класс, который выполняет некоторую модификацию строки:

public class StringModifier {
    public static String prefixUnderscore(String text) {
        return "_" + text;
    }

    public static String postfixUnderscore(String text) {
        return text + "_";
    }
}

Теперь, основываясь на некоторых условиях, яможет иметь поле а или поле б.Чтобы создать объект, я делаю:

private static SampleClass getSampleClassWithB(String b, String c, Function<String, String> mapper) {
        String d = mapper.apply(b);
        return SampleClass.builder().b(b).c(c).d(d).build();
    }

    private static SampleClass getSampleClassWithA(String a, String c, Function<String, String> mapper) {
        String d = mapper.apply(a);
        return SampleClass.builder().a(a).c(c).d(d).build();
    }

И для использования этих функций:

getSampleClassWithA("a", "c", StringModifier::postfixUnderscore);
getSampleClassWithB("b", "c", StringModifier::prefixUnderscore);

Теперь, как вы можете видеть, getSampleClassWithA и getSampleClassWithB выполняют довольно похожие вещи.Есть ли способ объединить это в метод?

1 Ответ

0 голосов
/ 23 мая 2018

Как всегда, если два или более метода работают в основном одинаково, и вы хотите избежать дублирования кода, вы должны найти абстракцию для разницы, в данном случае, вызов либо a, либо * 1002.*, на застройщика:

private static SampleClass getSampleClassWith(
    String value, BiFunction<SampleClassBuilder,String,SampleClassBuilder> property,
    String c, Function<String, String> mapper) {

    return property.apply(SampleClass.builder(),value).c(c).d(mapper.apply(value)).build();
}
getSampleClassWith("a", SampleClassBuilder::a, "c", StringModifier::postfixUnderscore);
getSampleClassWith("b", SampleClassBuilder::b, "c", StringModifier::prefixUnderscore);
...