gpt4 book ai didi

java - 我可以构建一个知道该子类的某些属性值的子类实例吗

转载 作者:行者123 更新时间:2023-12-01 15:43:26 25 4
gpt4 key购买 nike

我有一个所谓的属性类的层次结构,它代表我的域模型的单个属性。每个 Attribute 类都有一个唯一的 String id 属性。我还有一个 AttributeFactory,它有一个根据 id 检索 Attribute 实例的方法。

public class Attribute {
private String id;
private AttributeType type;
.......
.......

public Attribute(String id){
this.id=id;
}

public void setID(String id){
this.id=id;
}

public String getID(){
return this.id;
}

.......
.......
}

工厂的界面如下所示

public interface IAttributeFactory {

Attribute getAttributeByID(String id);
}

此接口(interface)的一个实现可以有一个 HashMap 作为所有已定义属性的存储库。

属性子类的一个例子是:

public class ClientCode extends Attribute {

public ClientCode(){
super("clientCode");
this.setType(AttributeType.CHAR_TYPE);
}

........
........
}

问题是,我们是否可以使用反射或任何其他东西构建属性子类的新实例,只知道该子类的 id,因此实现上面定义的接口(interface),而不需要定义 HashMap 并添加每个新定义的子类到 HashMap?

提前谢谢您丹尼尔

最佳答案

如果 ID 是由客户端代码任意选择的,那么就不可能知道哪个 ID 属于哪个 Attribute 子类。然而,如果你能以某种方式强制执行一个模式,那么只需要知道 ID 就可以实例化子类。您可以通过反射(reflection)来做到这一点。

下面的示例代码如何通过反射创建新实例:

public void createInstanceOfSubclass(String id) {
try {
Class cls = Class.forName(convertIDToClassName(id));
Class parameterTypes[] = new Class[1];
parameterTypes[0] = String.TYPE;
Constructor ct = cls.getConstructor(parameterTypes);

Object arglist[] = new Object[1];
arglist[0] = id;
Object subclassInstance = ct.newInstance(arglist);
}
catch (Throwable e) {
System.err.println(e);
}
}

[这只是示例代码;例如,在实际实现中可以改进错误处理。]

基本上,您必须编写convertIDToClassName(String) 方法来将ID 转换为类名。如果没有这种关联,就不可能将两者联系起来。

另一个想法是,属性的​​ID是由你计算的;这意味着 Attribute 类设置自己的 ID 字段。结果,您直接将子类名称和 ID 字段链接在一起。因此,可以通过 ID 实例化子类。

无论如何,个人评论是避免反射并坚持在代码中创建类(可能在工厂类中的某个地方取出实例化代码,以便您的主代码获得 closed for modification )。

关于java - 我可以构建一个知道该子类的某些属性值的子类实例吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7605613/

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