Реализация компонента

Компоненты, зарегистрированные с помощью точки расширения типов, похожи на обычные компоненты. Они могут принимать набор зависимостей через конструктор и должны реализовывать зарегистрированный интерфейс. Ниже приведен пример реализации NullNameableService.

/**
 * Реализация службы Nameable по умолчанию. Методы не выполняют никаких функций.
 *
 * @since 3.1
 */
public class NullNameableService implements INameable {

    /**
     * Конструктор компонента. Не вызывается напрямую.
     */
    public NullNameableService() {}

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

Показана только общая схема, класс не выполняет никаких функций. Служба INameable сообщает родителю о состоянии потомка. Если используется интерфейс такого типа, реализация по умолчанию обычно не выполняет никаких функций. Поэтому если родитель не запрашивает информации о состоянии потомка, его можно игнорировать. По общепринятому соглашению префикс "Null" означает, что компонент не выполняет никаких функций. С целью экономии системных ресурсов обычно регистрируется только один экземпляр такого обьекта. Клиентам следует самостоятельно проверять, можно ли создавать несколько экземпляров интерфейсов, сообщающих о состоянии.

Если интерфейс создан для того, чтобы выделять системные ресурсы или осуществлять вывод, реализация по умолчанию обычно более функциональна. Ниже приведен пример реализации класса DefaultMessageDialogs. Класс создан для обеспечения диалога пользователя с системой, поэтому он не может быть создан в нескольких экземплярах. Его реализация по умолчанию выполняет некоторые функции. Класс требует доступ к классу Composite компонента, поэтому он не может быть создан в единственном экземпляре. По общепринятому соглашению префикс "Default" означает, что используется компонент по умолчанию, выполняющий некоторые функции.

/**
 * Реализация интерфейса IMessageDialogs по умолчанию. Контекстом является управляющий элемент
 * компонента. Реализация позволяет компоненту открывать диалоги в дочернем окне.
 *
 * @since 3.1
 */
public class DefaultMessageDialogs implements IMessageDialogs {

    private Composite control;
   
    /**
     * Конструктор компонента. Не вызывается напрямую.
     */
    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>