IT/Programming / / 2023. 4. 27. 09:20

<Effective Java> RULE 38 인자의 유효성을 검사하라

반응형

 

메서드와 생성자는 인자로 사용하는 값을 제한한다.

이런 제한들은 문서로 남겨야 하며 메서드 시작부분에서 검사해야한다.

오류를 가급적 빨리 탐지해야 한다는 일반 원칙의 특수한 경우이다.

· 이러한 검사를 생략하면 오류를 탐지하기 어려워질 뿐 아니라, 설사 탐지하더라도 발생 지점을 파악하기 어려워 진다.

 

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이 발생

· 정렬전에 비교가능한지 검사하는건 의미가 없다.

 

계산과정에서 암묵적으로 유효성 검사가 이루어지는 경우

· 검사가 실패했을 경우 엉뚱한 예외를 던지는 경우가 많다.

· 예외 변환을 통해 문서에 명시된 예외로 변환해야 한다.

 

인자에 제약을 두는것은 바람직 하다 - 가 아니라 메서드는 가능하면 일반적으로 적용될 수 있도록 설계해야 한다는게 맞다.

 

메서드나 생성자를 구현할 때는 받을 수 있는 인자에 제한이 있는지 따져봐야 한다. 제한이 있다면 문서에 남기며 메서드 앞부분에 검사해야한다.

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유