2013-05-06 11 views
6

Mam starszą klasę C1, implementującą interfejs I, która może generować pewne wyjątki.Tworzenie bezpiecznej dla wyjątków osłony klasy

Chcę utworzyć klasę C2, również implementującą interfejs I, która jest oparta na instancji klasy C1, ale przechwytuje wszystkie wyjątki i robi coś użytecznego na ich temat.

Obecnie moja realizacja wygląda następująco:

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

    ... 

} 

(Uwaga: Mógłbym również rozszerzyć C1 C2 To nie ma znaczenia dla bieżącego pytania.).

Interfejs zawiera wiele funkcji, więc muszę napisać tę samą próbę ... blok catch ponownie.

Czy istnieje sposób na zmniejszenie ilości powielania kodu?

+0

metody chcesz „wrap” są wyłącznie z interfejsu czy istnieją dodatkowe te? Ponieważ nie jest to jasne, ponieważ nadpisujesz niektóre widoczne metody pakietu w swojej próbce. –

+0

Nie, jeśli chcesz mieć zwykłe źródło java dla C2. –

+0

@Java Mentor Jaką to robi różnicę? –

Odpowiedz

1

Można zrobić Proxy, to może faktycznie być rodzajowy

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(); 
    } 
} 
Powiązane problemy