使用reflection的通用构建器模式类
使用generics实现构建器模式会很棒。 从理论上讲,可以使用reflection来实现以下目标:
MyClass myClass = GenericBuilder.aObject() .withThisProperty("foo") .withThatProperty(4) .build();
我已经做了以下代码:
public class CursistBuilder { private Cursist cursist = null; private CursistBuilder() { cursist = new Cursist("username not set", "email not set"); } public static CursistBuilder aCursist() { return new CursistBuilder(); } public CursistBuilder withNaam(String name) { cursist.setGebruikersnaam(name); return this; } public CursistBuilder withEmail(String email) { cursist.setEmail(email); return this; } public Cursist build() { return cursist; } }
如何实现这一目标?
它不是正确的构建器模式,因为对象不是在create
function中create
,但您可以将其用作改进的参考
public static class Builder { public final T instance; public Builder(Class clazz) throws InstantiationException, IllegalAccessException { super(); this.clazz = clazz; this.instance = clazz.newInstance(); } private final Class> clazz; Builder setProperty(String name, Object value) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { Method method = clazz.getMethod("set" + name.substring(0, 1).toUpperCase() + name.substring(1), value.getClass()); method.invoke(instance, value); return this; } T create() { return instance; } }
如何使用它:你通过将类传递给构造函数来创建构建器的实例
Builder
然后使用方法setProperty(String name, Object value)
来调用对象的setter,
你做了什么? 例如,为您的类传递一些默认值,不要使用非args构造函数
我不知道这是你想要的,但如果我是你,我会像下面这样实施//
主>>
public class Main { public static void main(String[] args) { GenericBuilder gb = GenericBuilder.getInstance(); gb= gb.withThisProperty("String", "AAAAAA"). withThisProperty(4, 9). withThisProperty(5.8f, 6.7f). withThisProperty("Array", new ArrayList()).build(); System.out.println(gb.toString()); } };
VO >>
public class GenericBuilder { private Map
我重写toString()来显示其中的内容,并声明Map为某个地方赋值,如果你想要你可以用其他集合更改它。 谢谢/