2010-12-01 9 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でコード」と呼んでいます。

デコレータを生成したいインターフェイスに移動します。

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

[Alt] + [Enter]を押して[Implement Interface]を選択し、 "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キー+今赤マークされている「オブジェクト」に入力し、「フィールドの作成」を選択し、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キーは、単に岩:あなたがこのテンプレートを使用してファイルを作成したときだけ Altキー+ Inserと選択肢のデリゲートメソッドを使用し、その後、

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

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

と:D

+0

可能性があり –

+2

私はあなたのための完全な記述を追加しました。 –

+0

Thx +1完全な答え:)。テンプレートを作成したら、ファイルを作成してから「Alt + Inser」を1つ作成するだけなので、ファイルテンプレートを作成しました。作成時間は、ソリューションとほぼ同じである必要がありますが、キーボードの操作は少なくて済みます。 –

1

あなたは、おそらくのようなファイルのテンプレートを追加することができます。 は、それは完璧ではないのですが、これは、私はあなたが最初からクラスを作成したい場合、それがどのように動作するかを見つけていないショートカット

+0

悪くないですが、実装するメソッドを生成することもできます(デリゲートオブジェクトへの呼び出しを委譲することもできます)。 –

関連する問題