2010-12-01 6 views
15

A veces, puedo crear una clase decorador de la siguiente manera:¿Puede IntelliJ crear automáticamente una clase de decorador?

class MyInterfaceDecorator implements MyInterface { 
    private final MyInterface delegate; 
    ... constructor taking a MyInterface instance ... 

    @Override 
    public Object someInterfaceMethod(Some argument) { 
     return delegate.someInterfaceMethod(argument); 
    } 

    ... etc, more methods here... 
} 

Puede IntelliJ crear automáticamente esta clase para mí?

Respuesta

30

actualización //

Noté que IntelliJ tiene un "generar" opción para la generación de métodos de delegado. Crear una clase nueva:

public class MyDecoratorClass { 
    private MyInterfaceWithManyMethods myInterface; 
} 

luego marca MyInterface, vaya a Menú> Métodos Código> Delegados, seleccione todos los métodos que desee para envolver y eso es todo.

// Fin de la actualización

Se podría probar el "Refactoring" -> "Reemplazar la herencia con la delegación" refactorización. Debería poder hacer esto, así. Yo llamo a esto "Código con Alt + Intro"

Vaya a la interfaz para la que desea generar un decorador.

public interface MyInterfaceWithManyMethods { 
    void method1(); 
    void method2(); 
    void method3(); 
} 

Pulse Alt + Enter, seleccione "Implementar interfaz", dar un nombre a su decorador como "MyDecorator". Esto le da

public class MyDecorator implements MyInterfaceWithManyMethods { 
    public void method1() { 
    } 
    public void method2() { 
    } 
    public void method3() { 
    } 
} 

En nueva clase, seleccione el nombre de la clase, a continuación, "Refactor" -> "Reemplazar la herencia con la delegación", seleccione su interfaz, marque todos los nombres de los métodos, pulse enter. Obtendrá:

public class MyDecorator { 

    private final MyObject object = new MyObject(); 

    public void method1() { 
     object.method1(); 
    } 

    public void method2() { 
     object.method2(); 
    } 

    public void method3() { 
     object.method3(); 
    } 

    private class MyObject implements MyInterfaceWithManyMethods { 
     public void method1() { 

     } 

     public void method2() { 

     } 

     public void method3() { 

     } 
    } 
} 

Elimine manualmente la clase interna y el inicializador de objetos. Que se obtiene:

public class MyDecorator { 


    public void method1() { 
     object.method1(); 
    } 

    public void method2() { 
     object.method2(); 
    } 

    public void method3() { 
     object.method3(); 
    } 

} 

Pulse Alt + Enter en el "objeto" que ahora está marcado en rojo, seleccione "Crear un campo", seleccione MyInterfaceWithManyMethods.

public class MyDecorator { 


    private MyInterfaceWithManyMethods object; 

    public void method1() { 
     object.method1(); 
    } 

    public void method2() { 
     object.method2(); 
    } 

    public void method3() { 
     object.method3(); 
    } 

} 

Seleccione la variable de objeto, pulse Alt + Enter, seleccione "Agregar parámetro constructor":

public class MyDecorator { 


    private MyInterfaceWithManyMethods object; 

    public MyDecorator(MyInterfaceWithManyMethods object) { 
     this.object = object; 
    } 

    public void method1() { 
     object.method1(); 
    } 

    public void method2() { 
     object.method2(); 
    } 

    public void method3() { 
     object.method3(); 
    } 

} 

Usted ve que todo está hecho con unos pocos trazos de Alt + Enter. Parece mucho trabajo, pero se puede hacer en menos de 20 segundos. Si solo tiene 2 o 3 métodos, puede ser más rápido con una plantilla activa, sin embargo, si tiene muchos métodos con firmas complejas, obtendrá un resultado de trabajo en aproximadamente 20 segundos con este método. Alt + Enter simplemente rocas: D

+0

No encuentro cómo funciona cuando desea crear una clase desde cero –

+2

Agregué una descripción completa para usted. –

+0

Thx +1 para la respuesta completa :).Escribí una plantilla de archivo porque cuando se crea la plantilla, solo tienes que crear el archivo, y luego solo una "Alt + Inser". El tiempo para crear debería ser casi el mismo que su solución, pero con menos manipulaciones de teclado. –

1

Usted tal vez puede agregar una plantilla de archivo como:

class ${NAME} implements ${INTERFACE} { 
    private final ${INTERFACE} delegate; 

    public ${NAME}(final ${INTERFACE} delegate) { 
     this.delegate = delegate; 
} 

y luego, cuando haya creado el archivo usando esta plantilla, sólo tiene que utilizar Métodos Alt + Inser y delegadas elección. No es perfecto, pero podría ser un atajo

+0

No está mal, pero sería bueno si también pudiera generar los métodos a implementar (delegar llamadas para delegar objetos). –

Cuestiones relacionadas