2010-04-12 2 views
0

특정 패키지의 클래스에 대한 모든 getter가 주어진 템플릿을 따르도록하고 싶습니다.자바의 클래스 getter에 코딩 템플릿 적용

예를 들어, 모든 게터는 형식이어야합니다

 
XXX getYYY(){ 
    classLock.lock(); 
    return YYY; 
    finally{ 
     classLock.unlock(); 
    } 
} 

는 기본적으로, 모든 게터 그 형태가 아니라면 내 프로젝트를 실행/컴파일되지 않습니다합니다.

가장 좋은 방법은 무엇입니까? Eclipse 플러그인으로 사용할 수있는 솔루션을 선호합니다.

감사합니다, 아브

+0

코드가 컴파일되지 않습니다. 'try'없이'finally' 블록을 가질 수 없습니다. –

+1

당신은 이것을 강제 할 수 없습니다. 비록 당신이 할 수 있었다조차 아무 점도 없을 것입니다. 스레드 안전은 자동화 될 수 없습니다. – cletus

+0

@cletus : 스레드 안전성을 자동화 할 수 있습니다 (또는 명확하게 : by-design으로 빌드 할 수 있음). 그러나 자바가하는 것보다 훨씬 다른 접근법을 취할 것이다. –

답변

4

는 확인을하도록 컴파일러에 강제 할 수있는 방법이 없습니다. PMD 또는 CheckStyle과 같은 정적 코드 분석 도구를 살펴보고이를위한 고유 한 규칙을 정의 할 수 있습니다.

그런 다음 빌드주기 중에 해당 도구를 호출하고 클래스에서 해당 검사가 실패하면 치명적인 오류가 발생합니다.

하지만 그 종류의 게터가 코드에 대한 스레드 안전성의 수준이 될지 확신하지 못합니다. 두 개의 getter를 연속적으로 호출 할 때 일관성없는 값을 읽을 수 있습니다.

0

이 목적으로 이클립스 플러그인을 작성할 수 있습니다.

빌더 용 API (컴파일러와 유사한 플러그인)가 있으며 Eclipse Java 컴파일러의 AST (추상 구문 트리)에 액세스하여 검사를 수행 할 수 있습니다.

이클립스 플러그인을 사용하는 경우 큰 문제는 아닙니다.

Article about AST
Article about Builders

5

왜 컴파일 단계에서 당신의 게터를 포장 자동 -AspectJ (또는 다른 측면 지향 프레임 워크)를 사용? 래핑하려는 메소드 유형 (특정 클래스 세트에서 말하기)을 지정하고 사전/사후 실행을 제공 할 코드를 지정할 수 있습니다.

+0

빌드 타임 주입 후 코드를 제대로 디버깅 할 수 있습니까? –

+0

예. 바이트 코드 직조를 사용하므로 줄 번호 등이 유지됩니다. –

0

+1 Brians 제안의 경우 또는 런타임시 Spring AOP와 비슷한 것을 사용하십시오. 런타임 프레임 워크를 사용하면 별도의 컴파일러가 필요하지 않으며 컨텍스트 파일에서 한 행만 제거하여 모든 메서드에서 래핑을 제거 할 수 있다는 이점이 있습니다.

관련 문제