2010-12-01 71 views
15

有時候,我創建了一個裝飾類是這樣的:IntelliJ能自動創建裝飾類嗎?

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... 
} 

可以自動的IntelliJ創建此類給我嗎?

回答

30

更新//

我注意到的IntelliJ有一個 「生成」 生成委託方法的選擇。創建一個新的類:

public class MyDecoratorClass { 
    private MyInterfaceWithManyMethods myInterface; 
} 

然後標記MyInterface的,進入菜單>代碼>委託方法,選擇要包裝的所有方法,就是這樣。

//結束時更新

你可以嘗試 「重構」 的 - > 「替換代表團繼承」 重構。它應該能夠做到這一點,就像這樣。我稱之爲「帶Alt + Enter的代碼」

轉到要爲其生成裝飾器的界面。按下Alt + Enter,選擇「Implement Interface」,給你的Decorator命名爲「MyDecorator」。這給你

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

在新類,選擇類名,然後在「重構」 - >「替換代表團繼承」,選擇你的界面,勾選所有方法的名稱,然後按ENTER鍵。您將得到:

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() { 

     } 
    } 
} 

手動刪除內部類和對象初始值設定項。你得到:

public class MyDecorator { 


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

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

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

} 

按Alt + Enter鍵即現在標記爲紅色的「對象」,選擇「創建域」中,選擇MyInterfaceWithManyMethods。

public class MyDecorator { 


    private MyInterfaceWithManyMethods object; 

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

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

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

} 

選擇對象變量,按Alt + Enter鍵,選擇 「添加構造函數的參數」:

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(); 
    } 

} 

你看,這一切都與Alt + Enter鍵幾筆完成。讀取像很多工作,但可以在20秒內完成。如果您只有2或3種方法,則使用實時模板可能會更快,但是如果您有許多複雜簽名方法,則使用此方法可以在大約20秒內獲得工作結果。 Alt + Enter鍵只是岩石:d

+0

我不知道它是如何工作的,當你想從頭創建一個班級 – 2010-12-01 17:40:44

+2

我爲你添加了完整的描述。 – 2010-12-01 18:20:17

1

您或許可以添加一個文件模板,如:

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

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

,然後當你已經使用這個模板創建的文件,只是使用 Alt + Inser和選擇委託方法。 這不是完美的,但這可能是一個快捷方式