이야기박스
Effective java 3/E - 메서드 (item 49~56) 본문
반응형
Item 49. 매개변수가 유효한지 검사하라
매개변수에 어떤 제약 변수가 있을지 생각해보자. 그리고 메서드 초기 단계에서 검사해보자
Item 50. 적시에 방어적 복사본을 만들라
원본이 아닌 복사본을 사용할 것 --> Date 예
복사본을 통한 방어적인 행동이 힘들다면? --> 문서를 잘 남기도록 합시다
Item 51. 메서드 시그니처를 신중히 설계하라
- 메서드 이름은 신중히
- 편의 메서드를 너무 많이 만들지 맙시다
- 매개변수 목록은 짧게 유지할 것 (4개 이하)
- 매개변수 타입은 클래스보다는 인터페이스가 좋음
Item 52. 다중정의는 신중히 사용하라
다중정의는 어지간하면 피하자
특히 가변인수 사용할 경우, 다중정의 하지 말 것
다중정의 하고 싶으면 --> 메서드 이름을 다 다르게 하자
Item 53. 가변인수는 신중히 사용하라
필수 매개변수는 앞으로 빼자!
가변인수 성능 문제 고려할 것!
--> 가변인수는 배열을 생성함 --> 자주 쓰이는 패턴은 가변인수가 아닌 평범한 매개변수로 하고
그 이후, 나머지는 가변인수로 할 것
Item 54. null이 아닌, 빈 컬렉션이나 배열을 반환하라
null이 아닌 빈 컨테이너를 반환해야 하는 이유
- 빈 컨테이너 할당한다고 성능이 딱히 저하되지 않음
- 빈 컬렉션 & 배열은 굳이 새로 할당하지 않고도 반환 가능
/**
* 배열의 경우
*/
private static final String[] EMPTY_STRING_ARRAY = new String[0];
public String[] getStrings() {
return EMPTY_STRING_ARRAY;
}
/**
* 컬렉션의 경우
*/
public List<String> getStrings2() {
return new ArrayList<>(10);
}
Item 55. 옵셔널 반환은 신중히 하라
Optional 클래스란? 변수 하나만 담고 있음
* @since 1.8
*/
public final class Optional<T> {
/**
* Common instance for {@code empty()}.
*/
private static final Optional<?> EMPTY = new Optional<>();
/**
* If non-null, the value; if null, indicates no value is present
*/
private final T value;
/**
* Constructs an empty instance.
*
* @implNote Generally only one empty instance, {@link Optional#EMPTY},
* should exist per VM.
*/
private Optional() {
this.value = null;
}
==> 예시
public static <E extends Comparable<E>> Optional<E> max(Collection<E> c) {
if (c.isEmpty()) {
return Optional.empty();
}
E result = null;
for (E e : c) {
if (result == null || e.compareTo(result) > 0) {
result = Objects.requireNonNull(e);
}
}
return Optional.of(result);
}
Optional 반환할 때는 null을 반환하지 말 것!
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
EMPTY 반환함
Stream 버전으로 만든다면, stream의 맥스 연산이 optional 생성해줌
public static <E extends Comparable<E>> Optional<E> maxStream(Collection<E> c) {
return c.stream().max(Comparator.naturalOrder());
}
옵셔널을 반환 받는다면, 클라이언트에서 기본값을 설정해야 함
@Test
public void test1() {
List<String> words = new ArrayList<>();
String word = max(words).orElse("why is it empty?");
log.info(word);
}
@Test
public void test2() {
List<String> words = new ArrayList<>();
words.add("first");
String word = max(words).orElse("why is it empty?");
log.info(word);
}
@Test
public void test3() {
List<String> words = new ArrayList<>();
words.add("first");
String word = max(words).get();
log.info(word);
}
컬렉션, 스트림, 배열, 옵셔널 같은 컨테이너 타입은 옵셔널로 감싸지 말 것--> 있는 그대로 반환할 것
Optional<T> 사용하면 좋은 경우?
- 결과가 없을 수 있음
- 클라이언트가 이 상황을 특별히 처리해야 함
박싱된 기본 타입은 --> OptionalInt, OptionalLong 등 사용할 것
Item 56. 공개된 API 요소에는 항상 문서화 주석을 작성하라
공개된 모든 클래스, 인터페이스, 메서드, 필드 선언에 문서화 주석을 달 것
해당 메서드와 클라이언트 사이의 규약을 명료하게 기술
반응형
'Programming Language > JAVA' 카테고리의 다른 글
Effective java 3/E - 예외 (item 69~77) (0) | 2019.01.03 |
---|---|
Effective java 3/E - 일반적인 프로그래밍 원칙 (item 57~68) (0) | 2018.12.27 |
Effective java 3/E - 람다 & 스트림 (item 42~48) (0) | 2018.12.20 |
Effective java 3/E - 열거타입 & 어노테이션 (item 34~41) (0) | 2018.12.13 |
Effective java 3/E - 제네릭 (item 26~33) (1) | 2018.12.05 |