방어 프로그래밍을 위한 편집기 템플릿
-
22-08-2019 - |
문제
최근에 저는 내부 상태 노출에 대한 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})
호출을 래핑된 인스턴스에 위임하여 현재 메서드의 구현을 생성하므로 복사/붙여넣기 오류가 방지됩니다.