Si lee el código fuente de Eclipse, encontrará que IAdaptable es una interfaz muy popular que es implementada por muchos otros. ¿Por qué tantas clases / interfaces implementan IAdaptable? La respuesta es que Adapter es el patrón de diseño principal para eclipse Core Runtime.
¿Qué es IAdaptable?
public interface IAdaptable { /** * Returns an object which is an instance of the given class * associated with this object. Returns <code>null</code> if * no such object can be found. * * @param adapter the adapter class to look up * @return a object castable to the given class, * or <code>null</code> if this object does not * have an adapter for the given class */ public Object getAdapter(Class adapter); } |
IAdaptable se utiliza para el soporte de la extensión Eclipse. Adapta una clase existente a otra interfaz. El método getAdapter devuelve un objeto convertible a la interfaz dada.
Vale la pena mencionar que adaptar una clase significa obtener una clase contenedora que es un subtipo del objetivo. La clase contenedora envuelve al adaptado.
¿Por qué necesitamos IAdaptable?
A medida que se agregan nuevas características al sistema, y esas nuevas características requieren servicios proporcionados por la clase existente, necesitamos hacer que los servicios existentes sean aplicables a las nuevas características (es decir, la clase).
Un ejemplo típico es la vista Propiedades de Eclipse. Presenta un conjunto de propiedades del objeto seleccionado. Cuando selecciona cualquier elemento en la vista Pacakge o en la vista Jerarquía, la vista de propiedades mostrará las propiedades del elemento seleccionado.
La vista de propiedades necesita una interfaz para obtener las propiedades y luego mostrarlas. La interfaz es IPropertySource.
El complemento org.eclipse.resources proporciona interfaces como IResource, IFile, IFolder, etc. Si queremos que la vista de propiedades muestre las propiedades de IFile, una forma es permitir que IFile extienda IPropertySource. Esto funcionará, pero hay varios problemas de esta solución.
public interface IFile extends IPropertySource |
En primer lugar, se debe cambiar un objeto IFile para implementar métodos de IPropertySource. En segundo lugar, es posible que necesitemos IFile para implementar muchas otras interfaces, entonces el resultado sería inflado.
Si un objeto IFile implementa la interfaz IAdapter, entonces
public Object getAdapter(Class adapter){ if(adapter.equals(IPropertySource.class)){ return new PropertySourceAdapter(this); } return null; } |
class PropertySourceAdapter implements IPropertySource{ private final Object item; public PropertySourceAdapter(Object item){ this.item = item; } //required methods of IPropertySource ... } |
De esta manera, los objetos que implementan la interfaz IAdaptable se pueden adaptar fácilmente a cualquier interfaz dada.
En realidad, esta no es la solución utilizada en eclipse, porque esto requiere cambios de clase IFile. Cuando lea la parte 3 de IAdaptable, encontrará que IFile no debe cambiarse. El adaptador está configurado en el archivo plugin.xml.