2013-05-06 4 views
6

인터페이스 I를 구현하는 레거시 클래스 C1이 있는데 예외가 발생할 수 있습니다.클래스의 예외 안전 래퍼 만들기

클래스 C2를 만들고 인터페이스 I도 구현합니다.이 인터페이스는 C1의 인스턴스를 기반으로하지만 모든 예외를 포착하여 유용한 정보를 제공합니다.

현재 내 구현은 다음과 같습니다

class C2 implements I { 
    C1 base; 

    @Override void func1() { 
     try { 
     base.func1(); 
     } catch (Exception e) { 
     doSomething(e); 
     } 
    } 

    @Override void func2() { 
     try { 
     base.func2(); 
     } catch (Exception e) { 
     doSomething(e); 
     } 
    } 

    ... 

} 

(참고 :. 나는 또한이 현재의 문제에 대한 문제가되지 않습니다 C2는 C1을 연장 할 수있다).

인터페이스에는 많은 기능이 포함되어 있으므로 동일한 try ... catch 블록을 반복해서 써야합니다.

여기에 코드 복제량을 줄이는 방법이 있습니까?

+0

당신이 싶은 방법은 "포장"일반 될 수있는 인터페이스에서 순수하게 또는 추가 사람이 있습니까? 샘플의 일부 패키지 보이는 메서드를 재정의하므로 명확하지 않기 때문입니다. –

+0

C2 용 일반 Java 소스를 원한다면 원하지 않습니다. –

+0

@Java Mentor 어떤 차이가 있습니까? –

답변

1

당신은 프록시를 만들 수 있습니다, 실제로

interface I1 { 
    void test(); 
} 

class C1 implements I1 { 
    public void test() { 
     System.out.println("test"); 
     throw new RuntimeException(); 
    } 
} 

class ExceptionHandler implements InvocationHandler { 
    Object obj; 

    ExceptionHandler(Object obj) { 
     this.obj = obj; 
    } 

    @Override 
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
     try { 
      return method.invoke(obj, args); 
     } catch (Exception e) { 
      // need a workaround for primitive return types 
      return null; 
     } 
    } 

    static <T> T proxyFor(Object obj, Class<T> i) { 
     return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(), new Class[] { i }, 
       new ExceptionHandler(obj)); 
    } 
} 

public class Test2 { 

    public static void main(String[] args) throws Exception { 
     I1 i1 = ExceptionHandler.proxyFor(new C1(), I1.class); 
     i1.test(); 
    } 
}