아이템 49 : 매개변수가 유효한지 검사하라
메서드와 생성자 대부분은 입력 매개변수의 값이 특정 조건을 만족하기를 바랍니다.
- 예) 인덱스 값은 음수가 아니어야함
- 예) 객체 참조는 null이 아니어야함
이러한 제약은 반드시 문서화해야 하며 메서드 몸체(로직)가 시작되기 전에 검사해야합니다.
매개변수 검사를 제대로 하지 못하면 아래와 같은 문제가 발생합니다.
- 메서드가 수행되는 중간에 모호한 예외를 던지며 실패
- 메서드가 잘 수행되지만 잘못된 결과를 반환
- 메서드가 문제없이 수행되었지만, 어떤 객체를 이상한 상태로 만들어놓아서 미래의 알 수 없는 시점에 이 메서드와 관련 없는 오류가 발생
public & protected 메서드
매개변수의 제약을 문서화한다면 그 제약을 어겼을 때 발생하는 예외도 함께 기술해야합니다.
/**
* (현재 값 mod m) 값을 반환한다. 이 메서드는
* 항상 음이 아닌 BigInteger를 반환한다는 점에서 remainder 메서드와 다르다.
*
* @param m 계수(양수여야 한다.)
* @return 현재 값 mod m
* @throws ArithmeticException m이 0보다 작거나 같으면 발생한다.
*/
public BigInteger mod(BigInteger m) {
if (m.signum() <= 0) {
throw new ArithmeticException("계수(m)는 양수여야합니다. " + m);
}
...
}
자바 7에 추가된 java.util.Objects.requireNonNull 메서드는 null 검사를 수동으로 하지 않게끔 해줍니다.
// strategy가 null일 경우 NullPointerException이 발생하고, exception 메시지로 "전략"이 세팅됩니다.
this.strategy = Objects.requireNonNull(strategy, "전략");
자바 9에서는 Objects에 범위 검사 기능도 추가되었습니다.
- checkFromIndexSize
- checkFromToIndex
- checkIndex
private 메서드
공개되지 않은 메서드라면 assert를 사용할 수도 있습니다.
단, assert는 JVM 옵션으로 -ea 또는 --enableassertions 플래그를 설정하면 검사를 수행하지 않습니다.
private void methodName(Integer value) {
assert value != null;
...
}
유효성 검사의 예외가 되는 경우
- 유효성 검사 비용이 지나치게 높거나 실용적이지 않을 때
- 계산 과정에서 암묵적으로 검사가 수행될 때
Reference
반응형
'☕️ JAVA > Effective JAVA' 카테고리의 다른 글
[Effective Java] 아이템 5 : 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2022.01.02 |
---|---|
[Effective Java] 아이템 68 : 일반적으로 통용되는 명명 규칙을 따르라 (0) | 2021.12.18 |
[Effective Java] 아이템 33 : 타입 안전 이종 컨테이너를 고려하라 (0) | 2021.11.28 |
[Effective Java] 아이템 23 : 태그 달린 클래스보다는 클래스 계층구조를 활용하라 (0) | 2021.11.21 |
[Effective Java] 아이템 13 : clone 재정의는 주의해서 진행하라 (0) | 2021.11.14 |