문제

최근에 저는 내부 상태 노출에 대한 FindBugs 경고 작업을 했습니다.배열의 복사본을 반환하는 대신 배열에 대한 참조가 반환된 경우.해당 코드를 더 쉽게 변환할 수 있도록 몇 가지 템플릿을 만들었습니다.

방어 프로그래밍을 지원하고 SO 군중과 공유하기 위해 만든 것은 무엇입니까?

지금까지 만든 템플릿(예):

메소드에서 반환할 배열의 복사본을 만들려면 다음 안내를 따르세요.

final ${type}[] ${result} = new ${type}[ ${array}.length ];
System.arraycopy( ${array} , 0 , ${result} , 0 , ${array}.length );

객체를 복제하려면:

(${o}!= null?(${type})${o}.clone():null)
도움이 되었습니까?

해결책

나는 "더 안전한" equals() 정의를 템플릿으로 사용하는 것을 좋아합니다.

 /**
 * Implement equals based on ${cursor}. <br />
 * See {@link #compareTo(Object) compareTo}
 * @see java.lang.Object#equals(java.lang.Object)
 */
public boolean equals(final Object anObject)
{
    boolean res = false;
    if(anObject == null) { return false; }
    if(anObject == this) { return true; }
    if(anObject.getClass() == this.getClass())
    {
        res = this.compareTo(anObject) == 0;
    }
    return res;
}

항상 피하려면 방정식:같음 메서드는 슈퍼클래스의 같음을 재정의하며 대칭이 아닐 수 있습니다. (EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC), 어디:

이 클래스는 슈퍼클래스의 equals 메서드를 재정의하는 equals 메서드를 정의합니다.두 같음 메서드 모두 두 개체가 같은지 여부를 결정할 때 인스턴스를 사용합니다.

이것은 위험을 안고 있습니다. 왜냐하면 equals 메소드가 대칭적이라는 것이 중요하기 때문입니다(즉, a.equals(b) == b.equals(a)).
만약에 B 의 하위 유형입니다. A, 그리고 A의 equals 메소드는 인수가 다음과 같은지 확인합니다. instanceof A, B의 equals 메소드는 인수가 다음과 같은지 확인합니다. instanceof B, 이러한 방법으로 정의된 등가 관계는 대칭이 아닐 가능성이 높습니다.


이는 구현하는 클래스에만 해당됩니다. Comparable 다음을 허용합니다.

  • 항상 동일한 동등의 구현;
  • 모든 비교 논리는 한 곳에만 위치합니다( compareTo() 기능);
  • javadoc 준수 Comparable#compareTo() 그것을 보장해 달라고 요구하는 것 (x.compareTo(y)==0) == (x.equals(y)) (강력히 권장되지만 엄격하게 요구되는 것은 아닙니다).

다른 팁

템플릿은 아니지만 제가 사용하는 array.clone() 대신에 System.arraycopy().그게 문제가 있나요?

편집하다:데코레이터를 구현할 때 특히 메서드가 많은 인터페이스에 사용하는 템플릿입니다.

wrapped.${enclosing_method}(${enclosing_method_arguments})

호출을 래핑된 인스턴스에 위임하여 현재 메서드의 구현을 생성하므로 복사/붙여넣기 오류가 방지됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top