1

私は次の問題を抱えています:

//class XmlObject is part of org.apache.xmlbeans
public class DepartmentType extends XmlObject; // getName method is defined in this class
public class OrganizatiopnType extends XmlObject; // getName method is defined in this class

XmlObject department = null;
if (a == 1)
    department = (DepartmentType) order.getDepartment(); // returns DepartmentType
else
    department = (OrganizationType) order.getOrganization(); // returns OrganizationType

department.getName(); // throws cannot find symbol
// ... and do some other complex stuff using methods which are defined in both classes ...

getName()メソッドを呼び出す最もクリーンな方法は何ですか?

更新1: Cyber​​nate、 &
を制御できる場合、あなたのアプローチは最も論理的であるように思われます。残念ながら、これらのオブジェクトはxmlbeansによってXMLスキーマから生成されます。私の場合、両方のタイプが共通ベースを持つようにスキーマを再設計できます。DepartmentTypeOrganizationType

しかし、スキーマを制御できない場合はどうなりますか。基本的な考え方をどのように実装できますか?

4

4 に答える 4

2

両方のクラスに共通のインターフェースを実装させ、代わりにそれにキャストすることをお勧めします。あなたの現在のキャストが効果を発揮できるかどうかわかりません...

public interface NamedElement
{
    String getName();
}

...

NamedElement department = a == 1 ? order.getDepartment() : 
                                   order.getOrganisation();
String name = department.getName();

DepartmentTypeもちろん、これは、とOrganizationTypeコードを制御できることを前提としています。

于 2011-04-04T19:04:11.240 に答える
2

注:これは、現在のクラス階層に代わるものです。

XmlObjectから拡張するUnitTypeBaseと呼ばれる中間クラスを定義します。何かのようなもの

public class UnitTypeBase extends XmlObject{
 public String getName(){
  //Some implementaition or you can mark it as abstract
 }
}

次に、 UnitTypeBaseから* DepartmentTypeとOrganizationType *を派生させます

//class XmlObject is part of org.apache.xmlbeans 
public class DepartmentType extends UnitTypeBase; // getName method is defined in this class 
public class OrganizatiopnType extends UnitTypeBase; // getName method is defined in this class  
UnitTypeBase department = null; 
if (a == 1)     
  department = (DepartmentType) order.getDepartment(); // returns DepartmentType 
else     
     department = (OrganizationType) order.getOrganization(); // returns OrganizationType  
department.getName(); 
     // ... and do some other complex stuff using methods which are defined in both classes ... 
于 2011-04-04T19:04:38.567 に答える
0

getNameメソッドを使用してインターフェースを作成すると、DepartmentTypeクラスとOrganizationTypeクラスの両方がこのインターフェースを実装します。そのような ;

public class IName {
   public void getName();
}

public class DepartmentType extends XmlObject implements IName {}

public class OrganizationType extends XmlObject implements IName {}

IName department = null;
if (a==1)
  department = order.getDepartment();
else
 department = order.getOrganization();
String name = department.getName();
于 2011-04-04T19:12:41.117 に答える
0

スキーマを制御できる場合は、他の型から拡張できる基本抽象型を定義できます。私はこれを自分で試したことがないので、XmlBeansがどのように処理するかわかりません。

<complexType name="NamedEntity" abstract="true">
    <sequence>
        <element name="name" type="string"/>
    </sequence>
</complexType>

<complexType name="DepartmentType">
    <complexContent>
        <extension base="NamedEntity">
            <sequence>
                <element name="whatever"/>
            </sequence>
        </extension>
    </complexContent>
</complexType>

それ以外の場合は回避策(ハック?)ですが、生成されたクラスがJavaBeanの命名規則に従っている場合は、 CommonsBeanUtilsを使用できます。これらのオブジェクトが頻繁に渡される場合は、ラッパークラスを作成して、呼び出しをもう少し具体的にすることができます。

public class Department {
    XmlObject obj;

    public Department(XmlObject obj){
        if(!obj instanceof DepartmentType || !obj instanceof OrganizatiopnType){
            throw new IllegalArgumentException();
        }
        this.obj = obj;
    }

    public String getName(){
        return (String)PropertyUtils.getProperty(obj, "name");
    }
}

間接参照が多すぎる場合を除いて、間接参照の別のレイヤーを使用して問題を解決できます。

于 2011-04-04T22:06:58.553 に答える