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 を制御できないことを忘れていました。