2011-08-30 2 views
1

내가 최근에 많이 구아바가 제공 수집 필터 기능을 사용하여 프로젝트 작업,하지만 난이 예상되는 동작 생산하지 않습니다 같은 것을 발견?나는 술어에서 변수가 적용 평가할 수있는 방법

Predicate<ProductClassDTO> secLevelPredicate = new Predicate<ProductClassDTO>() { 
    @Override 
    public boolean apply(ProductClassDTO pcLevel2) { 

     if (pcLevel2.getFatherNodeSid() != null) 
     return pcLevel2.getFatherNodeSid() == dto.getSid(); 
     else 
     return false; 
    } 
    }; 

DTO를 object는 바깥 쪽 루프의 객체이지만 여전히 도달 할 수 있습니다.

해당 적용 메소드의 리턴은 True로 나오지 않지만 dto.getSid()를 db 노드에서 얻은 아버지 노드 번호 인 1740과 같은 실제 숫자로 대체하면 결과가 정상입니다.

그래서 apply()에서 변수를 평가할 수 없다는 것을 알 수 있습니까?

그것의 실행이이 문제의 핵심 있어야 할 관찰 부작용

가 발생하지 않습니다 :

내가 알 apply() javadoc에서는 선 말하고있다?

답변

5

dto은 메소드 내에서 최종 변수가되어야하고 dto은 로컬 변수 여야합니다.

dto.getSid()Integer을 반환 할 가능성이 있으며 문제는 값 대신 참조를 비교하는 것입니까? 당신은 그냥 사용하여 올바른 깔끔한 코드를 만들 수 있습니다

@Override 
public boolean apply(ProductClassDTO pcLevel2) { 
    return Objects.equal(pcLevel2.getFatherNodeSid(), dto.getSid()); 
} 
+0

예, 저는 정수 대신 값을 사용한다는 것을 잊었습니다. 모든 것이 잘되고, 당신이 여기에 준 개선은 많은 가치가 있습니다. 감사드립니다. – Lopakhin

1

보다는 당신의 final 변수가 익명 클래스의 내부에 읽은, 당신은 가능한 한 많은 범위를 제한하는 것이 더 낫다, 및 범위를 ""변수로 "유혈"시키지 않아야합니다.

실제로 구아바 설계자는이 방법을 통해 final 변수를 사용하지 말고 피하기 위해 도구를 제공했습니다. 이 경우, Predicates.equalToPredicates.compose의 조합입니다. 당신이 찾고있는 것이라고 생각합니다 :

관련 문제