2010-12-01 6 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를 누르고 "구현 인터페이스"를 선택하고 "MyDecorator"와 같은 장식 자의 이름을 지정하십시오. Enter 키를 누릅니다, 사용자 인터페이스를 선택> "대표단 상속을 교체"모든 메소드 이름을 선택합니다 - 이것은 다음 "팩터는"클래스 이름을 선택, 새로운 클래스에서 당신에게

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

을 제공합니다. 당신은 얻을 것이다 :

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 키를 선택 + 입력 :

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를 바위 : D

+0

클래스를 처음부터 만들 때 어떻게 작동하는지 모르겠습니다. –

+2

전체 설명을 추가했습니다. –

+0

Thx +1 완전한 대답 :).템플릿을 만들 때 파일을 만든 다음 하나의 "Alt + Inser"만 만들어야하기 때문에 파일 템플릿을 작성했습니다. 생성 시간은 솔루션과 거의 같아야하지만 키보드 조작은 적습니다. –

1

당신은 아마 같은 파일 템플릿을 추가 할 수 있습니다

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

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

다음은이 템플릿을 사용하여 파일을 만든 경우, 단지 Alt + Inser과 선택의 위임 방법을 사용합니다. 완벽하지는 않지만 바로 가기 일 수 있습니다.

+0

나쁘지는 않지만 구현할 메소드를 생성 할 수 있다면 좋을 것입니다 (객체 위임에 대한 호출 위임). –

관련 문제