2014-01-17 12 views
11

비 스레드 스프링 독립 싱글 톤 구현을 찾을 수있는 Checkstyle, PMD 또는 Findbugs 규칙이 있습니까?비 스레드 세이프 싱글 톤 스프링 구현을 찾는 코드 품질 규칙

private String helperVar; 

public String getValue(String value) { 
    helperVar = value; 
    return convertValue(); 
} 

private String convertValue() { 
    return helperVar.trim(); 
} 

이 샘플은 끔찍한 것이지만 내가 말하는 의미를 보여주는 가장 쉬운 방법입니다.

단일 실행에서 bean의 getValue 메소드를 실행할 때 잘 작동합니다. 그러나 다중 사용자 환경에서 실행하면 예기치 않은 오류/동작이 발생할 수 있습니다.

코드를 직접 거치지 않고 이러한 현상을 찾을 수있는 방법이 있습니까? 이 코드와이 코드의 각 변형을 자동으로 확인할 수있는 정적 코드 검사기가 있습니까?

+0

필드의 설정자이며 해당 필드를 기반으로하는 'toString'이 연속적으로 호출 되어도 충분합니다. 오싹 해. –

+1

도와 주셔서 고마워요.하지만 코드에 문제가 없습니다. 동일한 패턴의 다른 항목을 자동으로 찾고 싶습니다. 샘플 코드와 관련된 질문이 없습니다. 질문은 전적으로 사용 가능한 코드 검사기에 관한 것입니다. – B4dT0bi

+1

코드를 비판하지는 않았지만 코드 패턴 _ "필드를 변경하고 해당 필드의 여러 항목으로 계산"_이 매우 일반적이라는 것을 나타내려고합니다. –

답변

1

이것은 사용자에게 허용되지 않을 수 있지만 때로는 런타임 bean reflection을 사용하여 코드 일관성을 확인합니다.

당신의 유익한 사용을 위해서 먼저 모든 콩을 constructor 기반 주입을 사용하고 모든 회원 필드를 final으로 만들 것입니다. 나는 findbugs가 심지어 불변의 bean checker를 가지고 있다고 믿는다.

둘째로 코드을 사용하거나 ApplicationContextAware을 구현 한 클래스를 사용하고 ApplicationContext를 살펴 봅니다. 이제 응용 프로그램 컨텍스트에서로드되는 bean을 확인하고 모든 필드가 final인지 확인하기 위해 beans 클래스의 패키지 이름을 확인하십시오. 그렇습니다. 좀 더 느슨한 보안 관리자가 필요하거나 보안 정책을 사용하여 개인 변수 반영을 허용 할 수 있습니다.하지만 대부분의 경우이 기능은 이미 최대 절전 모드와 같은 것을 사용하는 경우 특히 문제가되지 않습니다.

최종 코드가 유효하지 않은 필드가있는 경우 예외가 발생하고 Spring 응용 프로그램이 시작되지 않습니다.

규칙에 대한 여러 예외를 제외하고는 최종일 필요가없는 필드 또는 규칙을 무시해야하는 클래스에 대해 사용자 지정 주석을 사용할 수 있습니다.

성능에 문제가 있거나 스프링 생성자 주입이 충분히 강력하지 않을 수도 있지만 스프링이 부팅시에 이미 엄청난 양의 반사를하고 있으며 생성자 기반 주입이 요즘에는 강력하기 때문에 재산 장소도 할 수 있습니다 홀더 값은 @Value(${PROP})입니다.

1

당신은 방법에 약간의 빌드를 가지고

FindBugs library

으로 시도 할 수 있습니다.

정확하게 필요한 것은 없지만 필요에 따라 확장 할 수 있습니다. 이 검출기의 일반적인 생각은 클래스의 바이트 코드의 특정 패턴을 찾을 수 있습니다

Daniel Schneller blog

좋은 예에게 있습니다. 이렇게하려면 .class 파일을 읽고 방문자 패턴을 사용하여 구현 된 패턴 일치기를 통과시킵니다. 그것을 읽는 동안 어떤 요소 (방법, 필드 선언 등)가 있는지에 따라 적절한 방문자 메서드가 호출됩니다.탐지기를 작성한다는 것은 그 중 하나 이상을 구현하여 클래스의 목적에 대한 아이디어를 구축하는 것을 의미합니다.

좋은 점은 결국 테스트 모듈에 포함시킬 수있는 Java 코드라는 것입니다. 컴파일러 경고를 추가 할 수도 있지만 확실하지는 않습니다.