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

2024. 11. 28. 00:08·1️⃣ 백앤드/이펙티브 자바

1. null 을 반환하는 경우

private final List<Cheese> cheesesInStock = ...;

/**
 * @return 매장 안의 모든 치즈 목록을 반환한다.
 * 	단, 재고가 하나도 없다면 null을 반환한다.
 */
public List<Cheese> getCheeses() {
	return cheesesInStock.isEmtpy() ? null
		: new ArrayList<>(cheesesInStock);
}

위 코드처럼 cheeseInStock 이 비어있다고 해서 null 을 반환한다면, 클라이언트는 이 null 상황을 대비해 추가로 코드를 작성해야한다.

List<Cheese> cheeses = shop.getCheeses();
if (cheeses != null && cheeses.contains(Cheese.M\\ozzarell
	...
}

위와 같이 방어코드를 적어주어야 하며, 빼먹게 되면 오류가 발생할 수 있다. 이로인해 코드가 더 복잡해진다. 빈 컬렉션을 올바르게 반환하는 예를 살펴보자.

 

2. 빈 컬렉션을 반환하자.

public List<Cheese> getCheeses() {
    return new ArrayList<>(cheesesInStock);
}

빈 컬렉션을 할당하는 것이다. 매번 새롭게 할당하는 것이 부담스럽고 성능이 나오지 않는다면, 아래 예시와 같이 '불변'컬렉션을 반환하면 된다.

public List<Cheese> getCheeses() {
    return cheesesInStock.isEmpty() ? Collections.emptyList()
        : new ArrayList<>(cheesesInStock);
}

집합이 필요하면 Collections.emptySet 을, 맵이 필요하면 Collections.emptyMap 을 사용하면 된다.

 

3. 길이가 0인 배열을 반환하자

public Cheese[] getCheeses() {
    return cheesesInStock.toArray(new Cheeses[0]);
}

toArray 메서드에 길이 0짜리 배열을 건네 반환하자. 이 방식이 성능이 안좋다면, 길이 0짜리 배열을 미리 선언해두고 매번 그 배열을 반환하자. 길이가 0인 배열은 모두 불변이기 때문이다.

private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];

public Cheese[] getCheeses() {
    return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY);
}

이펙티브 자바 쉽지않군...

'1️⃣ 백앤드 > 이펙티브 자바' 카테고리의 다른 글

[아이템56] 공개된 API 요소에는 항상 문서화 주석을 작성하라  (1) 2024.11.28
[아이템55] 옵셔널 반환은 신중히 하라  (0) 2024.11.28
[아이템53] 가변인수는 신중히 사용하라  (0) 2024.11.26
[아이템52] 다중정의는 신중히 사용하라  (0) 2024.11.25
[아이템51] 메서드 시그니처를 신중히 설계하라  (0) 2024.11.24
'1️⃣ 백앤드/이펙티브 자바' 카테고리의 다른 글
  • [아이템56] 공개된 API 요소에는 항상 문서화 주석을 작성하라
  • [아이템55] 옵셔널 반환은 신중히 하라
  • [아이템53] 가변인수는 신중히 사용하라
  • [아이템52] 다중정의는 신중히 사용하라
HOZINU
HOZINU
주니어 백앤드 개발자의 세상만사 이모저모. 주로 개발 이야기를 다룸.
  • HOZINU
    백엔드 탐험 일지
    HOZINU
  • 전체
    오늘
    어제
  • 블로그 메뉴

    • ⛪ HOME
    • 🌍 GITHUB
    • 카테고리 (73)
      • 1️⃣ 백앤드 (72)
        • 이펙티브 자바 (72)
      • 2️⃣ CS (0)
        • 운영체제 (0)
        • 네트워크 기초 (0)
        • 네트워크 응용 (0)
        • SSL & PKI (0)
        • 기타 (0)
      • 3️⃣ 코딩테스트 (0)
      • 4️⃣ 개인공부 (0)
        • MSA (0)
        • REDIS (0)
      • 5️⃣ 일상이야기 (1)
  • 인기 글

  • 태그

    optional
    싱글턴
    정적 팩터리 메서드
    로타입
    컴포지션
    계층구조
    CLONE
    맥북
    멤버클래스
    빌더
    try-with-resources
    equals
    Cleaner
    캡슐화
    finalizer
    표준예외
    의존객체
    hashcode
    Comparable
    정보은닉
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
HOZINU
[아이템54] null 이 아닌, 빈 컬렉션이나 배열을 반환하라
상단으로

티스토리툴바