이야기박스

Effective java 3/E - 메서드 (item 49~56) 본문

Programming Language/JAVA

Effective java 3/E - 메서드 (item 49~56)

박스님 2018. 12. 20. 16:30
반응형

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 요소에는 항상 문서화 주석을 작성하라

공개된 모든 클래스, 인터페이스, 메서드, 필드 선언에 문서화 주석을 달 것

해당 메서드와 클라이언트 사이의 규약을 명료하게 기술


반응형