메서드와 생성자는 인자로 사용하는 값을 제한한다.
이런 제한들은 문서로 남겨야 하며 메서드 시작부분에서 검사해야한다.
오류를 가급적 빨리 탐지해야 한다는 일반 원칙의 특수한 경우이다.
· 이러한 검사를 생략하면 오류를 탐지하기 어려워질 뿐 아니라, 설사 탐지하더라도 발생 지점을 파악하기 어려워 진다.
public메서드라면 인자의 유효성위반에 관한 예외를 Javadoc의 @throw태그를 사용해서 문서화 하라(규칙 62)
보통 IllegalArgumentException, IndexOutOfBoundException, 또는 NullPointerException이 이용된다.(규칙 60)
/**
*
* 이 메서드는 remainder 메서드와는 다르다.
* remainder메서드는 항상 음수아닌 BigInteger를 반환한다.
*
* @author ismyeong
* @writeday 2018. 2. 26.
* @param
* @exception
* @return
*
*/
public BigInteger mod(BigInteger m) {
if(m.signum() <= 0) {
throw new ArithmeticException("Modulus <= 0 : " + m);
}
return m;
}
public이 아닌 메서드라면 일반적으로 인자의 유효성을 검사할 때 확증문(Assertion)을 사용한다.
//재귀적으로 정렬하는 private 도움 함수
private static void sort(long a[], int offset, int length) {
assert a != null;
assert offset >= 0 && offset <= a.length;
assert length >= 0 && length <= a.length - offset;
}
예외
· Collection.sort(List) 객체 리스트를 정렬하는 메서드
· 리스트를 정렬하는 과정에서 ㅁ리스트내의 모든 객체는 비교횐다.
· 비교 가능하지 않은 객체가 포함되어 있다면 도중 ClassCastException이 발생
· 정렬전에 비교가능한지 검사하는건 의미가 없다.
계산과정에서 암묵적으로 유효성 검사가 이루어지는 경우
· 검사가 실패했을 경우 엉뚱한 예외를 던지는 경우가 많다.
· 예외 변환을 통해 문서에 명시된 예외로 변환해야 한다.
인자에 제약을 두는것은 바람직 하다 - 가 아니라 메서드는 가능하면 일반적으로 적용될 수 있도록 설계해야 한다는게 맞다.
메서드나 생성자를 구현할 때는 받을 수 있는 인자에 제한이 있는지 따져봐야 한다. 제한이 있다면 문서에 남기며 메서드 앞부분에 검사해야한다.
'IT > Programming' 카테고리의 다른 글
<Effective Java> RULE 36 Override 어노테이션은 일관되게 사용하라 (0) | 2023.04.27 |
---|---|
<Effective Java> RULE 37 자료형을 정의할 때 표식 인터페이스를 사용하라 (0) | 2023.04.27 |
<Effective Java> RULE 39 필요하다면 방어적 복사본을 만들라. (0) | 2023.04.27 |
<Effective Java> RULE 40 메서드 시그너처는 신중하게 설계하라 (0) | 2023.04.27 |
<Effective Java> RULE 41 오버로딩할 때는 주의하라 (0) | 2023.04.26 |