Implementacja komponentu

Komponenty zarejestrowane za pomocą punktu rozszerzenia typów są podobne do komponentów części. Mogą przyjmować zestaw zależności w konstruktorze oraz muszą implementować interfejs, dla którego zostały zarejestrowane. W poniższym przykładzie przedstawiono implementowanie usługi NullNameableService.

/**
 * Domyślna implementacja usługi Nameable. Wszystkie metody nie wykonują żadnych operacji.
 *
 * @since 3.1
 */
public class NullNameableService implements INameable {

    /**
     * Konstruktor komponentu. Nie należy wywoływać bezpośrednio.
     */
    public NullNameableService() {}

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

Pomimo tego, że przedstawiona klasa niczego nie wykonuje, ten prosty przykład pokazuje typowy wzorzec. Usługa INameable jest używana do przekazania elementowi macierzystemu informacji o stanie elementu potomnego. Domyślna implementacja zazwyczaj niczego nie wykonuje w tym typie interfejsu. Dzięki temu w przypadku, gdy element macierzysty nie potrzebuje informacji o stanie elementu potomnego, może on zostać zignorowany. Zazwyczaj używa się przedrostka "Null" w celu wskazania, że dany komponent niczego nie wykonuje. Ten typ obiektu rejestruje się zwykle jako pojedynczy (singleton), ponieważ tworzenie wielu instancji dla tak mało znaczącego obiektu byłoby marnotrawstwem. Klienci powinni zapewnić każdemu nowemu interfejsowi, który tworzy raporty o stanie, możliwość przejścia multipleksowania.

Jeśli zadaniem interfejsu jest przydzielanie zasobów lub generowanie danych wyjściowych, implementacja domyślna będzie w większości przypadków wykonywać bardziej użyteczne zadania. W poniższym przykładzie zaprezentowano implementację klasy DefaultMessageDialogs. Ponieważ zadaniem tej klasy jest generowanie interaktywnych danych wyjściowych, zawiera ona użyteczną implementację domyślną i nie obsługuje multipleksowania. Ponieważ ta klasa wymaga dostępu do elementu złożonego części, nie może być typu singleton. Zazwyczaj używa się przedrostka "Default" w celu wskazania, że to jest komponent domyślny wykonujący pewną użyteczną funkcję.

/**
 * Implementacja domyślna interfejsu IMessageDialogs. Używa pola sterującego
 * części jako kontekstu i umożliwia części otwieranie okien dialogowych w powłoce elementu potomnego.
 *
 * @since 3.1
 */
public class DefaultMessageDialogs implements IMessageDialogs {

    private Composite control;
   
    /**
     * Konstruktor komponentu. Nie należy wywoływać bezpośrednio.
     */
    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);
        }   
    }
}

Poniżej pokazano powiązany język znaczników punktu rozszerzenia dla właściwości 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>