목록이펙티브자바 (88)
도당탕탕
만약 API가 사용가능하면, 반드시 문서화해야 한다. Java 환경에서는 Javadoc utility 로 이 작업을 쉽게 할 수 있다. Javadoc 은 소스코드로 부터 API 문서를 자동으로 생성한다. 모든 공개된 리소스에 주석을 달 것 API를 올바로 문서화하려면 공개된 클래스, 인터페이스, 메서드, 필드 선언에 문서화 주석을 달아야 한다. 메서드용 문서화 주석에는 규약을 명료하게 기술할 것 메서드용 문서화 주석에는 해당 메서드와 클라이언트 사이의 규약을 명료하게 기술해야 한다. 메서드가 어떻게 동작하는지를 적는 게 아니라 무엇을 하는지 기술해야 한다. 클라이언트가 해당 메서드를 호출하기 위한 전제조건을 모두 나열해야 한다. 메서드가 성공적으로 수행된 후에 만족해야 하는 사후조건도 나열해야 한다. 전..
자바 8 이전에는 메서드가 특정 조건에서 값을 반환할 수 없을 때 취할 수 있는 선택지가 다음과 같이 두 가지 있었는데 각각 문제가 있었다. 예외를 던진다. -> 진짜 예외에서만 사용해야 한다. null을 반환한다. -> null이 절대 반환되지 않는다고 확신하지 않는 한 별도의 null 처리 코드를 추가해야 한다. 하지만 자바 8에 Optional이 생기고 나서 위의 문제들을 어느 정도 해결해 줄 수 있었다. Optional Optional 는 null이 아닌 T 타입 참조를 하나 담거나, 혹은 아무것도 담지 않을 수 있다는 뜻이다. 즉 옵셔널은 원소를 최대 1개 가질 수 있는 불변 컬렉션 인다. 보통은 T를 반환해야 하지만 특정 조건에서는 아무것도 반환하지 않아야 할 때 T 대신 Optional를 반..
다음처럼 리스트가 비어있을 때 null을 반환하는 코드가 있다고 하자. private final List cheesesInStock = ...; public List getCheeses() { return cheesesInStock.isEmpty() ? null : new ArrayList(cheesesInStock); } 이렇게 할 경우, 저 함수를 사용하는 클라이언트는 다음과 같은 null 체크 로직을 수행해야 한다. List cheeses = shop.getCheeses(); if (cheeses != null && cheeses.contains(Cheese.STILTON)) System.out.println("Jolly good, just the thing."); 이러한 코드는 실수할 가능성이 존..
가변인수 메서드는 명시한 타입의 인수를 0개 이상 받을 수 있다. 가변인수 메서드를 호출하면, 가장 먼저 인수의 개수와 길이가 같은 배열을 만들고 인수들을 이 배열에 저장하여 가변인수 메서드에 건네준다. 다음 예를 보자. 간단한 가변인수 활용 예 static int sum(int... args) { int sum = 0; for (int arg : args) sum += arg; return arg; } 다음 예제는 args 들의 합을 도출하는 메소드이다. 런타임시 args의 배열을 만들고 해당 메서드에 인수를 전달해 처리한다. 그렇다면 다음 예를 한번 보자. 인수가 1개 이상이어야 하는 가변인수 메소드 - 잘못 구현한 예 static int min(int... args) { if (args.length..
public class CollectionClassifier { public static String classify(Set s) { return "Set"; } public static String classify(List lst) { return "List"; } public static String classify(Collection c) { return "Unknown Collection"; } public static void main(String[] args) { Collection[] collections = { new HashSet(), new ArrayList(), new HashMap().values() }; for (Collection c : collections) System.out..
이번 아이템에는 개별 아이템으로 두기 애매한 API 설계 요령들을 모아 놓았다. 다음을 보자. 1. 메서드 이름을 신중히 짓자. 항상 표준 명명 규칙을 따라야 한다. 이해하기 쉽고, 같은 패키지에 속한 다른 이름들과 일관되게 짓는 게 최우선 목표이다. 그다음 목표는 개발자 커뮤니티에서 널리 받아들여지는 이름을 사용하는 것이다. 긴 이름은 피하자. 애매하면 자바 라이브러리의 API 가이드를 참조하는 것이 좋다. 2. 편의 메서드를 너무 많이 만들지 말자. 모든 메서드는 각각 자신의 소임을 다해야 한다. 메서드가 너무 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수 하는데 어렵다. 인터페이스도 마찬가지이다. 따라서 아주 자주 쓰일 경우에만 별도의 약칭 메서드를 두기 바란다. 확신이 서지 ..
Java는 C나 C++에 비해 안전한 언어라고 할 수 있다. 하지만 우리가 작성한 클래스의 클라이언트에서 의도적이든, 실수로든 불변성을 파괴할 수 있음을 명심해야 한다. 첫 번째 가능한 공격 아래 코드는 클라이언트가 불변성을 파괴할 수 있는 예시이다. public final class Period { private final Date start; private final Date end; public Period(Date start, Date end) { if (start.compareTo(end) > 0) throw new IllegalArgumentException(start+"after"+end); this.start = start; this.end = end; } public Date start(..
메서드와 생성자 대부분은 입력 매개변수의 값이 특정 조건을 만족하기를 바란다. 예컨대 인덱스 값이 음수이면 안되고, 객체 참조는 null이면 안된다. 이런 제약은 반드시 문서화해야 하며 메서드 몸체가 시작되기 전에 검사해야 한다. 즉 오류는 가능한 한 빨리 잡아야 한다. 라는 일반 원칙의 한 사례이기도 하다. 오류를 잡지 못하면 해당 오류를 감지하기 어려워지고, 감지하더라도 오류의 발생 지점을 찾기 어려워진다. 매개변수 검사 방법 매개변수 검사를 제대로 하지 못하면 몇 가지 문제가 생길 수 있다. 메서드가 수행되는 중간에 모호한 예외를 던지며 실패할 수 있다. 더 나아가 잘못된 값을 반환해 메서드와는 관련 없는 오류를 낼 수 있다. 즉 매개변수 검사에 실패하면 실패 원자성을 어기는 결과를 낳을 수 있다...