代码之家  ›  专栏  ›  技术社区  ›  user1692342

为对象创建通用生成器,而不管传入的字段是什么

  •  1
  • user1692342  · 技术社区  · 7 年前

    我有一个具有多个字段的类:

    @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 + "_";
        }
    }
    

    现在,根据某些条件,我可能有字段A或字段B。要构建对象,我需要:

    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 回复  |  直到 7 年前
        1
  •  3
  •   Holger    7 年前

    和往常一样,如果两个或多个方法基本上是相同的,并且您希望避免代码重复,那么您必须找到一个不同的抽象,在这种情况下,调用 a b ,在生成器上:

    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);