コンポーネントの実装

タイプ拡張ポイントに登録されたコンポーネントは、パーツ・コンポーネントに類似しています。 そのコンストラクター内に依存関係のセットを取得でき、また、登録されたインターフェースを実装する必要があります。 この例では、NullNameableService の実装を示します。

/**
 * Default implementation of the Nameable service. All methods are no-ops.
 *
 * @since 3.1
 */
public class NullNameableService implements INameable {

    /**
     * Component constructor. Do not invoke directly.
     */
    public NullNameableService() {}

    public void setName(String newName) {}
    public void setContentDescription(String contentDescription) {}
    public void setImage(ImageDescriptor theImage) {}
    public void setTooltip(String toolTip) {}
}

この例は、クラスが何も実行しないためシンプルですが、共通のパターンを説明しています。 INameable サービスは、親に子の状態を伝達するために使用されます。 このタイプのインターフェースでは、通常、デフォルトの実装は何も実行しません。 これは、親がその子の状態に注意しない場合、それを無視できることを意味します。 規則により、"Null" 接頭部を使用して、これが何も実行しないコンポーネントであることを示すようになっています。 このタイプのオブジェクトは、そのような重要でないオブジェクトの複数インスタンスを作成して浪費する場合があるため、通常、singleton として登録されます。 クライアントは、状態をレポートするすべての新規インターフェースが多重化できることを確認する必要があります。

そのインターフェースの目的がリソースの割り振りまたは出力の生成である場合、デフォルトの実装は、通常、より実用的なことを実行します。 以下の例には、DefaultMessageDialogs クラスの実装が示されています。 このクラスは対話式の出力を生成することを意図しているため、有用なデフォルトの実装を備えていて、多重化はサポートしていません。 このクラスは、パートのコンポジットにアクセスする必要があるため、singleton にはできません。 規則により、クラス・プレフィックス "Default" を使用して、これが実用的な動作を伴ったデフォルト・コンポーネントであることを示すようになっています。

/**
 * Default implementation of the IMessageDialogs interface. Takes the part's
 * control as context and allows the part to open dialogs in a child shell.
 *
 * @since 3.1
 */
public class DefaultMessageDialogs implements IMessageDialogs {

    private Composite control;
   
    /**
     * Component constructor. Do not invoke directly.
     */
    public DefaultMessageDialogs(Composite control) {
        this.control = control;
    }
   
    public void open(IStatus message) {
        if (message.getSeverity() == IStatus.ERROR) {
            ErrorDialog.openError(control.getShell(), null, null, message);
        } else {
            open(message.getSeverity(), message.getMessage());
        }
    }

    public void openError(String message, Throwable cause) {
        open(new Status(IStatus.ERROR,
                WorkbenchPlugin.getDefault().getBundle().getSymbolicName(),
                IStatus.OK,
                message,
                cause));
    }
   
    public void open(int severity, String message) {
        if (severity == IStatus.ERROR) {
            MessageDialog.openError(control.getShell(), null, message);
        } else if (severity == IStatus.WARNING) {
            MessageDialog.openWarning(control.getShell(), null, message);
        } else {
            MessageDialog.openInformation(control.getShell(), null, message);
        }   
    }
}

以下は、DefaultMessageDialog 用の関連拡張ポイント・マークアップです。

<extension point="org.eclipse.core.component.types">
      <component
            initializer="org.eclipse.ui.part.SiteInitializer"
            interface="org.eclipse.ui.part.services.IMessageDialogs"
            implementation="org.eclipse.ui.internal.part.services.DefaultMessageDialogs"
            singleton="false"/>
</extension>