아이템 52 . 다중 정의는 신중히 사용하라
다중정의(overloading)
- 메서드 호출을 컴파일 타임에 정한다.
- 코드 52-1에서 Collections의 다형화를 사용하여 출력값을 다르게 지정했지만, 동작하지 않는 이유다.
cf. 재정의(overriding):
메서드를 동적으로 선택한다.
다중정의로 인해, 메서드의 다형성이 존재한다고 프로그래머가 착각하기 쉽다.
따라서 안전하게 가기 위해
- 매개 변수 수가 같은 다중정의는 하지 말자.
- 메서드명을 다르게 하자 (예. writeBoolean(boolean), writeInt(int) ...)
- 형변환을 통해 정확한 다중정의 메서드가 선택되도록 유도하자. (코드 52-3)
아이템 53. 가변인수는 신중히 사용하라
최소한 필요한 가변 인수 갯수가 있다면, (필수 매개변수 + 가변인수) 조합을 사용하자.
예. 53-2에서는 예외를 던져, 인수가 하나 이상 필요함을 알려준다. 문제는 함수를 호출하는 단에서는, 함수의 정의만 보고서는 최소 인자 개수를 파악할 수 없다. 즉, 내부 코드 동작 방식을 알아야하는 문제가 생겨, 추상화를 깨버린다.
(코드 53-2, 53-3 비교)
가변인수의 성능 해결법
- 가변인수 메서드는 호출시 배열을 하나 새로 할당, 초기화한다. 성능 이슈가 발생할 수 있다.
- 책 321의 예제처럼, 최소로 필요한 인자 개수가 파악될 경우, 해당 인자는 필수 매개변수로 넣고,
나머지 경우를 가변인수로 대체하자.
아이템 54. NULL이 아닌 빈 컬렉션이나 배열을 반환하라.
- 메서드가 null을 반환할 경우, 해당 메서드를 호출하는 곳에서 항상 방어 로직이 필요하다. (예. 책 323p 코드)
- 따라서 null 대신 빈 컬렉션과 빼열을 반환하자.
: 성능 저하가 있을 경우 불변 객체를 반환하자. (예. Collections.emptyList())
-> 왜 불변이 성능 이슈를 해결하지?
-> 왜 꼭 필요한지 체크해야하지?
아이템 55. 옵셔널 반환은 신중히 하라
언제 옵셔널 사용할까
결과값이 없고, 클라이언트가 이 상황을 특별히 처리해야할때
사용시 주의할 것
- null을 반환하지 말자. (옵셔널의 취지에 어긋남)
- 컬렉션, 스트림, 배열, 옵셔널은 옵셔널로 감싸면 안된다.
- 박싱된 기본 타입을 담는 옵셔널 사용하지 말자. (대체제: OptionalInt...)
orElse vs orElseGet
객체 초기화 비용에서 orElseGet이 유리하다.
성능
옵셔널 객체 생성에도 비용이 따르므로, 꼭 필요할 때만 사용하자.
아이템 56. 공개된 API 요소에는 항상 문서화 주석을 작성하라.
어디까지 해야할지 애매하다..?
'개발 > [스터디] 이펙티브 자바' 카테고리의 다른 글
[이펙티브자바]ch67-ch71 (0) | 2022.03.06 |
---|---|
[이펙티브 자바] 아이템 57~61 (0) | 2022.02.20 |
[이펙티브 자바 스터디] 아이템 41-46 (0) | 2022.01.23 |
[이펙티브 자바 스터디] 아이템 31~35 (0) | 2022.01.09 |
[이펙티브자바]아이템28. 배열보다는 리스트를 사용하여라. (0) | 2022.01.02 |