2014-06-05 1 views
0

나는 스프링 프레임 워크에 기반을 둔 일부 웹 프로젝트에서 일했고, 난 항상 :(여기에 쉬운 예를 원인 복잡성 수준의 동일한 PMD/Checkstyle 문제를 찾습니다. 우리는 정의지루한 체크 아웃 (봄과 솔루션)

상위 클래스.

public Class ObjectA(){ 
    private ObjectB objectB; 

    public ObjectB getObjectB(){ 
     return objectB; 
    } 
} 

둘째는 우리가하지 비어있는 경우에만, 지금은 ObjectA에서 "STR"문자열의 값을 얻는다.

public Class ObjectB(){ 
    private String str; 

    public String getStr(){ 
     return str; 
    } 
} 

을 하위 클래스를 정의하지만 ch가 필요 모든 객체가 null이 아닌 것을 확인하십시오.

첫 번째 솔루션 (4 조건) 봄에서 StringUtils에와

if(objectA != null 
     && objectA.getObjectB() != null 
     && objectA.getObjectB().getStr() != null 
     && !objectA.getObjectB().getStr().isEmpty()){ 
     // Do something... 
    } 

두 번째 솔루션 (3 조건) 내가 ObjectA에 ObjectB 있는지 확인하는 봄에 몇 가지 방법이 존재하는지 알고 싶어

if(objectA != null 
     && objectA.getObjectB() != null 
     && StringUtils.hasText(objectA.getObjectB().getStr())){ 
     // Do something... 
    } 

null가 아니고 메서드는 ObjectA도 null이 아닌지 확인해야합니다.

감사합니다 !!!

답변

2

그것은 캡슐화에 관한 모든 것입니다 기본적으로 게터를 체인하는 안티 패턴 (이럴)입니다.

이 부분을 ObjectA에 캡슐화하려면 getstr 메서드를 제공하고 getObjectB() 메서드를 제거해야합니다.

public class ObjectA { 
    private ObjectB objectB; 


    public String getstr() { 
     return objectB != null ? objectB.getstr() : null; 
    } 
} 

이제 다른 코드가됩니다.

if (objectA != null && StringUtils.hasText(objectA.getstr()) { ... } 
+0

해결책이 될 수 있지만 이러한 방법을 부모 클래스에 추가해야합니다. 나는 A에서 B를 얻는 일반적인 방법을 선호한다. 예를 들어이 getObjFromObj (Object target, String fieldName)을 가진 몇몇 클래스의 Utils 클래스, 그리고이 유틸리티가 Spring에 존재하는지 알고 싶다. – juanhl

+0

OO는 캡슐화에 대해 (다른 사람들 사이에서는) 무엇입니까. [Demeter의 법칙] (http://en.wikipedia.org/wiki/Law_of_Demeter)에 관한 모든 것입니다. ObjectA를 사용하는 객체는 ObjectA에 대해서만 알고 있어야하며 ObjectA가 사용하는 모든 공동 객체에 대해 알면 안됩니다. 그것은 좋은/좋은 디자인에 관한 것입니다. 또한 코드가 덜 부서지기 쉽습니다. –