본문 바로가기

Java/이펙티브 자바

이펙티브 자바 - 8장 메서드

매개변수가 유효한지 검사하라

 

매개변수 validate 를 하지 않으면 

Runtime 시에나 에러가 발생할수있다.

 

 

유효성 검사방법

 

Null

 

자바 7 부터는 Objects.requireNonNull 로 Null 검사를 쉽게 할 수 있다.

 

자바 9 부터는

Objects 의 checkFromIndexSize, checkFromToIndex, checkIndex 같은 메서드를 이용해

범위 검사도 할 수 있다.

 

assert 사용

private 메서드라면 assert 를 사용하여 유효성 검사를 할 수 있다.

조건식을 만족하지 않으면 AssertionError 가 발생한다.

 

 

적시에 방어적 복사본을 만들라.

Date 는 가변 매개변수다.

클래스가 클라이언트로부터 받는 매개변수가 가변이라면 

반드시 방어적으로 복사를 해야한다.

 

만약 저 코드에서 방어적 복사하는 new Date() 가 없다면

endDate 를 참조하고 있는 값을 변경하게 되면 
Dog 에 있는 endDate도 변경이 될것이다.

이걸 막아주기 위해서 생성자에 매개변수로 받은 값을 담고있는 새로운 객체를 만들어야한다.

-> 성능 저하가 있을 수 있다.

 

메시지 시그니처를 신중히 설계하라.

- 메서드의 이름은 신중하게 짓자.

- 편의 메서드를 너무 많이 만들지 말자

너무 많은 메서드는 테스트, 유지보수의 힘이 들게 된다.

 

- 매개변수를 4개 이상은 자제하자

매개변수를 줄일 수 있는 방법

1. 여러 메서드로 나눠본다.

2. 매개 변수를 묶어주는 도우미 메서드를 만든다.

3. 빌더 패턴을 사용한다.

 

- 매개변수 타입 에는 클래스 보다는 인터페이스를 사용하는게 좋다.

ex. HashMap(X) , Map (O)

 

 

 

메서드, 생성자의 다중정의는 신중하게 해야 한다.

다중정의는 혼란을 일으킬수있다.

메서드 이름을 다르게 정의해주는게 좋다.

listName(List<?> s) 와 같이..

 

생성자에서는 이름을 다르게 할 수 없으니

정적 팩토리를 사용해주는게 좋다.

 

 

- 매개변수의 수가 같다면 오버로딩 보다는 따로 생성하는게 좋다

 

 

가변인수는 신중히 사용하라.

가변인수는 성능에 문제가 있을 수 있다.

가변인수 메서드가 호출될 때마다 배열을 새로 할당하고 초기화하기 때문이다.

 

책에서는 매개변수가 3개 이하가 95% 라고 한다.

 따라서 이런식으로 다중정의를 해서 사용을 할 수 있다.

 

null이 아닌, 빈 컬렉션이나 배열을 반환하라

 

리턴 값이 null 이면 클라이언트에서는 null 을 방어하는 코드를 추가해야한다.

null 반환과 빈 컨테이너 반환은 성능 차이는 없다싶이 하기 때문에

빈컬렉션을 반환하는게 좋다.

 

 

 

null 보다는 빈 컬렉션을 반환해라

 

옵셔널 반환은 신중히 하라.

 

Optional 은 최대 1개 가질 수 있는 불변 컬렉션이다.

null-safe 한 코드를 작성할 수 있고 활용도가 좋다.

 

- 기본값을 설정할 수 있고

- 원하는 예외를 던질 수 있다.

 

하지만, 성능에 너무 민감한 곳에서는 Optional 을 사용하지 말자.

 

공개된 API 요소에는 항상 문서화 주석을 작성하라.

 

public 클래스, 인터페이스 , 메서드, 필드 선언에 doc 주석을 달아야한다.