2010-04-20 4 views
4

나는 많은 곳에서 못생긴 try catch 코드를 단순화 할 수있는 방법을 찾고있다. 예를 들어 내가보고 있어요 : 필드가 선택인지 아닌지Java에서 try/catch를 단순화하기위한 접근 방법

이런 종류의 일이 모든 다양한 분야의 여기 저기 반복
try { 
    objectA.setFieldX(objectB.getFieldY()); 
} 
catch(NullPointerException e) { 
...stuff 
} 
catch(OtherException e) { 
...stuff 
} 

, 일부는 기반으로 동작이 약간 다릅니다. 부피가 크며 문서화가 잘되어 있지 않으며 독자가 잘못된 코드를 제외하고는 틀릴 수도 있다는 뚜렷한 인상을 남깁니다.

내 DataTransferObejcts에 get() 또는 set (객체 값)과 같은 일종의 열거 형 FieldID를 사용하는 "일반"get 및 set 메서드가있는 경우 (표준 set (value) 및 get()

setRequiredField(source, <FieldIDAsource>, dest, <FieldIDAdest>); 
setOptionalField(source, <FieldIDBsource>, dest, <FieldIDBdest>); 
:

setRequiredField(objSource, <FieldIDsource>, objDest, <FieldIDdest) { 
    object SourceField = objSource.get(<FieldIDsource>); 
    if (sourceField != null) { 
     try { 
      objDest.set(<FieldIDdest>, SourceField); 
     } 
     catch (OtherException) { 
     ... stuff (like logging) here 
     } 
    } 
    else { 
     ... stuff (like logging) here 
    } 
} 

그런 다음 모든 설정을하는 방법은 같은 코드있을 것입니다 : - 나는 단순히 같은 몇 가지 도우미를 정의 할 수 있습니다 (추한 시도에 싸여 많은 세트와 클래스에/잡는다)

많이 부피가 작고 읽기 쉽고 정확합니다 ....

...하지만 같은 몇 가지 문제가 있습니다 : wazoo의를 캐스팅

1) : 일반적인 방법에서 (데이터 전송 개체에서이) 나는 캐스팅을 많이해야 할 것입니다.

2) 제네릭 메서드를 완전하게/올바르게 만들기 : 열거 형을 사용하여 다소 잠금을 가할 수 있지만 일반적인 메서드에서 실수를하는 걱정이 있습니다 (데이터 전송 개체를 "생성"하고 싶습니다. FreeMarker와 같은 것으로 - 그러나 그들에는 약간의 "도메인 로직"이 있습니다 ...). 사람이 어떻게 실제로

답변

2

을 알고 내가 좋아하는 것이 권리를 수행하는 몇 가지 포인터가있는 경우

어쨌든,이 관점 지향 프로그래밍 (AOP)을 통해 해결 될 수있는 무언가의 명확한 예입니다. 아이디어는 전체 응용 프로그램에서 발생하는 문제에 대한 표준 논리를 삽입 할 수 있다는 것입니다. 전형적인 예는 오류 처리 및 로깅입니다. Spring과 AspectJ를 포함하여 Java로 AOP를 수행하는 몇 가지 방법이있다. 자세한 내용은 http://www.voelter.de/data/articles/aop/aop.html을 참조하십시오.

+0

멋지다, 동료는 다른 지루한 세부 사항을 위해 나에게 AspectJ를 언급했다 - 지금 그것을 체크 아웃하는 또 다른 이유. 링크 –

+0

+1 AOP를 주셔서 감사합니다 ... 이것에 대한 이상적인 경우입니다 : D – CoolBeans

+0

귀하의 링크를 읽은 후 이것은 AOP에 대한 좋은 문제처럼 보입니다. 불행히도, 나는 링크 된 문서에있는 것들을 얻었고 다른 것들은 나를 벗어났다. "인형 용 측면 지향 프로그래밍"유형 페이지가 있습니까? –

2

당신은 스택 오버 플로우 When to choose checked and unchecked exceptions

주요 아이디어는 당신이 더 많은 일을 할 수있는 유일한 캐치 예외입니다에 다음 스레드를 참조해야합니다. 그렇지 않으면 예외를 마지막 레이어로 전달하고 로깅하기 전에 Exception을 직접 catch해야합니다.

+1

+1. 나는 당신이 체크 아웃 된 예외를 가지고 있다면 (그리고 당신의 메소드에 "throws"를 추가하고 싶지 않다) 당신은 체크되지 않은 예외로 그것을 변환해야한다고 덧붙인다. – Kris

+0

"catch NullPointerException"(if/else가 더 나은 성능을 가져야한다고 생각하는 것을 포함하여)과 "null"이 거의 "예외적 인"것은 아닙니다. "OtherException"항목은 모두 검사 된 것들입니다. 그래서 (도우미에서) NullPointerException을 발견 할 수 없습니다. –

0

문제점을 이해하는 경우 하나의 bean에서 다른 bean으로 특성을 복사하려고합니다. 당신은 그걸 위해서 dozer을 사용하는 것이 좋습니다 ...