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

컬렉션이나 배열 같은 컨테이너(container)가 비었을 때 null을 반환하는 메서드를 사용하면 방어 코드를 넣어줘야 한다. private final List cheesesInStock = ....; public List getCheeses() { return cheesesInStock.isEmpty() ? null : new ArrayList(cheesesInStock); } 제거기 앖디거 특별한 취급을 할 필요는 없지만 아래와 같이 방어 코드가 필요하다. List cheese = shop.getCheeses(); if (cheese != null && cheeses.contains(Cheese.STILTON)) Sytem.out.println("좋았어, 바로 그거야."); 사용 패턴에 따라 빈 컬..

[아이템 51] 메서드 시그니처를 신중히 설계하라

메서드 이름을 신중히 짓자. 같은 패키지에 속한 다른 이름들과 일관되게 짓는게 최우선 목표다. 편의 메서드※를 너무 많이 만들지 말자. 매개변수 목록은 짧게 유지하자. 4개 이하를 권장 여러 메서드로 쪼갠다. 잘못하면 메서드가 많아질 수 있으나 직교성※을 높여 메서드를 줄여주는 효과가 있다. subList, indexOf메서드를 사용하여 부분리스트에서 인덱스를 찾는 예시 매개변수 여러 개를 묶어주는 도우미 클래스를 만드는 것이다. 도우미 클래스는 정적 멤버 클래스로 둔다. 객체 생성에 사용한 빌더 패턴을 메서드 호출에 응용 매개변수의 타입으로는 클래스보다는 인터페이스가 더 낫다 boolean보다는 우너소 2개짜리 열거 타입이 낫다 직교성 공통점이 없는 기능들이 잘 분리되어 있다. 기능을 원자적으로 쪼개 ..

[아이템 39] 명명 패턴보다 애너테이션을 사용하라

전통적인 명명 패턴의 단점 오타 발생 시 컴파일러는 메서드를 무시하고 지나칠 수 있어 개발자는 오류가 없다고 인식할 수 있다. 올바른 프로그램 요소에 사용하지 않을 경우에 컴파일 오류, 런타임 오류 등 개발자가 인지할 수 있는 수준의 오류가 발생하지 않는다. 프로그램 요소를 매개변수로 전달할 방법이 없다. 애너테이션은 명명 패턴의 문제를 해결해주는 개념으로 Junit에도 버전 4부터 전면 도입됐다. 애너테이션 선언에 다는 애너테이션을 메타애너테이션(meta-annotation)이라 한다. 대상 코드의 의미는 그대로 둔 채 그 애너테이션에 관심 있는 도구에서 특별한 처리를 할 기회를 준다. 질문 정리 '이 코드는 EnumMap이 아닌 고유한 맵 구현체를 사용했기 때문에 EnumMap을 써서 얻은 공간과 성..

[아이템 19] 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라

상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지(자기사용) 문서로 남겨야 한다. 효율적인 하위 클래스를 큰 어려움 없이 만들 수 있게 하려면 클래스의 내부 동작 과정 중간에 끼어들 수 있는 훅(hook)을 잘 선별하여 protected 메서드 형태로 공개해야할 수도 있다. 상속용으로 설계한 클래스는 배포 전에 반드시 하위 클래스를 만들어 검증해야 한다. 상속용 클래스의 생성자는 직접적으로든 간접적으로든 재정의 가능 메서드를 호출해서는 안 된다. 재정의 가능 메서드를 호출하는 자기 사용 코드를 완벽히 제거해야한다. private, final, static 메서드는 재정의가 불가능하니 생성자에서 안심하고 호출해도 된다. 상속용으로 설계하지 않은 클래스는 상속을 금지한다. clone과..

[이펙티브 자바 3장] 모든 객체의 공통 메서드

1. 아이템13 81P : 배열의 clone 메소드는 깊은복사를 해서 배열의 clone 메서드는 사용 권장한다는 말까지는 이해 되었는데, "배열의 clone 은 런타임 타입과 컴파일타임 타입 모두가 원본 배열과 똑같은 배열을 반환한다" 라는 말을 이해하지 못하겠습니다 ..! => 자바 1.5부터 배열에 clone을 호출하면 반환되는 배열의 컴파일 시점 자료형은 복제 대상 배열의 자료형과 같기 때문에 컴파일 시점에 결정된 배열은 런타임 시점 타입과 동일하다. 2. 아이템13 : clone 메소드에 대해서 좀 보다가 사용하는 곳을 찾아보았는데 OOOService.java 의 Entity ent = entList.get(i).clone(); 요기는 clone 해서 사용하는 이유가 뭘까욤..?? => HashM..