これがあまり具体的でないことを願っています。
クラスを取得するためにXJCでコンパイルするXMLスキーマを作成しました。XMLは基本的に、フォームのいくつかの要素(テキストフィールド、ラベルなど)を表します。抜粋は次のとおりです。
<gruppoOggetti id="string" nome="string">
<oggetto xsi:type="labelType" etichetta="string" id="string" obbligatorio="false" />
<oggetto xsi:type="listaOpzioni" id="string" obbligatorio="1">
<opzione id="string">string</opzione>
</oggetto>
<oggetto xsi:type="imageType" etichetta="string" id="string" obbligatorio="0" />
</gruppoOggetti>
ご覧のとおり、オブジェクトのタイプは属性xsi:typeから定義されているため、jaxbを使用してxmlをすべてアンマッシュすると、適切なクラスが自動的にインスタンス化されます。
ここで質問:オブジェクトを作成するために抽象ファクトリを実装しているので、基本的に、xmlが作成する必要があると言っているオブジェクトに応じて、ファクトリの異なるメソッドを呼び出す必要があります。私が今使っている満足のいく方法はこれです:
public OggettoBase creaOggetto(Factory f, OggettoType oggetto)
{
String tipo = oggetto.getClass().getSimpleName().toString();
OggettoBase ret = null;
switch(tipo)
{
case "CheckBoxType": ret = f.createCheckbox(); break;
case "ImageType":ret = f.createImage(); break;
case "LabelType":ret = f.createLabel(); break;
case "LinkType": ret = f.createLink(); break;
case "ListaOpzioni": ret = f.createLista(); break;
case "PasswordType": ret = f.createPassword(); break;
case "RadiobuttonType": ret = f.createRadiobutton(); break;
case "TextareaType": ret = f.createTextarea(); break;
case "TextfieldType": ret = f.createTextfield(); break;
default : System.out.println("Il tipo: "+tipo+" non esiste");
}
return ret;
}
別の方法(スイッチ/ケースの代わりに編集)を使用したいのですが、列挙型について考えていましたが、まだ十分ではありません。また、私は反射を使いたくありません。