37.3.2. checkWidgets の操作

概要

checkWidgets は、置換グループのヘッドメンバーのパラメーターがある簡単な操作です。この操作は、置換グループのメンバーである個々のパラメーターを処理する方法を示しています。コンシューマーは、パラメーターが置換グループの有効なメンバーであることを確認する必要があります。サービスは、置換グループのどのメンバーが要求で送信されたかを適切に判別する必要があります。

コンシューマーの実装

生成されたメソッドシグネチャーは、置換グループの head 要素のタイプをサポートする Java クラスを使用します。置換グループのメンバー要素は、head 要素と同じ型であるか、head 要素の型から派生した型であるため、置換グループのメンバーをサポートするために生成された Java クラスは、head 要素をサポートするために生成された Java クラスから派生している。Java の型階層は、親クラスの代わりにサブクラスを使用することをネイティブにサポートします。

Apache CXF が置換グループの型および Java の型階層を生成する方法が原因で、クライアントは特別なコードを使用せずに checkWidgets() を呼び出すことができます。checkWidgets() を呼び出すロジックを開発する場合は、ウィジェットの置換グループに対応するために生成されたクラスの 1 つのオブジェクトを渡すことができます。

例37.14「checkWidgets() を呼び出すコンシューマー」 に、checkWidgets() を呼び出すコンシューマーを示します。

例37.14 checkWidgets() を呼び出すコンシューマー

System.out.println("What type of widgets do you want to order?");
System.out.println("1 - Normal");
System.out.println("2 - Wood");
System.out.println("3 - Plastic");
System.out.println("Selection [1-3]");
String selection = reader.readLine();
String trimmed = selection.trim();
char widgetType = trimmed.charAt(0);
switch (widgetType)
{
  case '1':
  {
    WidgetType widget = new WidgetType();
    ...
    break;
  }
  case '2':
  {
    WoodWidgetType widget = new WoodWidgetType();
    ...
    break;
  }
  case '3':
  {
    PlasticWidgetType widget = new PlasticWidgetType();
    ...
    break;
  }
  default :
    System.out.println("Invaid Widget Selection!!");
}

proxy.checkWidgets(widgets);

サービス実装

checkWidgets() のサービスの実装は、ウィジェットの記述を WidgetType オブジェクトとして取得し、ウィジェットのインベントリーを確認し、ストックされているウィジェットの数を返します。置換グループの実装に使用されるクラスはすべて同じベースクラスから継承されるため、JAXB 固有の API を使用せずに checkWidgets() を実装することができます。

widget の置換グループのメンバーをサポートするように生成されたクラスはすべて、WidgetType クラスを拡張します。このため、instanceof を使用して、渡されたウィジェットの型を決定し、単純に widgetPart オブジェクトをより制限のある型にキャストできます (適切であれば)。適切なタイプのオブジェクトを取得したら、適切な種類のウィジェットのインベントリーを確認できます。

例37.15「checkWidgets() のサービス実装」 は、可能な実装を示しています。

例37.15 checkWidgets() のサービス実装

public int checkWidgets(WidgetType widgetPart)
{
  if (widgetPart instanceof WidgetType)
  {
    return checkWidgetInventory(widgetType);
  }
  else if (widgetPart instanceof WoodWidgetType)
  {
    WoodWidgetType widget = (WoodWidgetType)widgetPart;
    return checkWoodWidgetInventory(widget);
  }
  else if (widgetPart instanceof PlasticWidgetType)
  {
    PlasticWidgetType widget = (PlasticWidgetType)widgetPart;
    return checkPlasticWidgetInventory(widget);
  }
}