我有多个从XSD
文件生成的类XJC
. 这些类是作为构建过程的一部分自动生成的,因此无法修改。这些类共享一个共同的结构。我有需要使用这些类的客户端代码。但是,某些客户端逻辑对于所有类都是相同的。因此,我不想为每个要支持的类复制客户端代码。在这种情况下想到的流行解决方案是使用接口/继承,以便客户端代码只处理超类/接口而不是特定类。但是,在这种情况下,这种解决方案是不可能的,因为无法修改类。因此,我想正确的方向是使用组合而不是继承。但是,如果使用组合,组合类将需要处理每个特定的类,所以我最终可能会得到很多if (obj instanceof Type)
分别处理每个案件。
public class A {
private int id;
//Properties specific to type A
}
public class B {
private int id;
//Properties specific to type B
}
public class C {
private int id;
//Properties specific to type C
}
public class Client {
public void myMethod(Object obj) {
//obj may be an instance of A, B or C
//I would like to access the id property (which is common to A, B and C)
//using the most elegant way
//Approach using instanceof
if(obj instanceof A) {
A objA = (A)obj;
objA.getId();
}
if(obj instanceof B) {
B objB = (B)obj;
objB.getId();
}
if(obj instanceof C) {
C objC = (C)obj;
objC.getId();
}
}
}
我考虑过使用一种方法,其中实例被包装,instanceof 逻辑位于包装类而不是客户端代码中。
public class Wrapper {
private Object obj;
public int getId() {
if(obj instanceof A)
return ((A)obj).getId();
if(obj instanceof B)
return ((B)obj).getId();
if(obj instanceof C)
return ((C)obj).getId();
}
}
public class Client {
public void myMethod(Wrapper wrapper) {
//Only deals with wrappers, not with the objects themselves
wrapper.getId();
}
}
在这种情况下是否需要使用instanceof
?如果是,推荐的方法是什么?
编辑:
反射也可以用来避免多重instanceof
。按照给定的示例,如果在每个类(和)getId()
中都定义了该方法A
,则可能出现以下情况:B
C
public class Wrapper {
private Object obj;
public int getId() {
return obj.getClass().getMethod("getId").invoke(obj);
}
}
我忘了提到我对 XSD 没有任何控制权。