gpt4 book ai didi

java - 使用反射的通用构建器模式类

转载 作者:行者123 更新时间:2023-12-02 05:27:01 24 4
gpt4 key购买 nike

如果能用泛型实现构建器模式那就太好了。理论上,可以使用反射来实现以下目的:

    MyClass myClass = GenericBuilder<MyClass>.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 中创建功能,但您可以将其作为改进的引用

public static class Builder<T> {
public final T instance;

public Builder(Class<T> clazz) throws InstantiationException,
IllegalAccessException {
super();
this.clazz = clazz;
this.instance = clazz.newInstance();
}

private final Class<?> clazz;

Builder<T> 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<MyClass> builder = new Builder<>(MyClass.class);

然后使用方法setProperty(String name, Object value)在您的对象上调用 setter,

你能做什么?例如,为您的类传递一些默认值,并且不要使用非参数构造函数

关于java - 使用反射的通用构建器模式类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25909701/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com