본문 바로가기

책/Effective Java

(11)
클래스와 인터페이스 클래스와 멤버의 접근 권한을 최소화하라 - 모든 클래스와 멤버의 접근성을 가능한 좁혀야 한다. - public 클래스의 인스턴스 필드는 되도록 public이 아니어야 한다. - public 가변 필드를 갖는 클래스는 일반적으로 스레드 안전하지 않다. ((public static final로 선언된 상수 제외) - public static final 배열 필드를 두거나 이 필드를 반환하는 접근자 메서드를 제공해서는 안 된다. (배열은 private으로 만들고, 반환 객체는 불변 리스트 혹은 배열의 복사본으로 한다.) public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 - public 클래스라면 데이터 필드를 직접 노출하지 말고 접근자, 변경자 메소드를 제공하자. - package-p..
모든 객체의 공통 메서드 equals는 일반 규약을 지켜 재정의하라재정의하지 않아도 되는 경우 - 각 인스턴스가 본질적으로 고유하다. ex) Thread - 인스턴스의 논리적 동치성을 검사할 일이 없다. - 상위 클래스에서 재 정의한 eqauls가 하위 클래스에도 딱 맞는다. - 클래스가 private이거나 package-private이고 equals 메서드를 호출할 일이 없다.재정의해야 할 때 - 논리적 동치성을 확인해야 하는데, 상위 클래스의 equals가 논리적 동치성을 비교하도록 재정의되지 않았을 때. ex) String, Integer (값 클래스) - 5가지 규약을 지켜야 한다. (반사성, 대칭성, 추이성, 일관성, null-아님) equals를 재정의하려거든 hashCode도 재정의하라 - equals가 두 객체를 ..
객체 생성과 파괴 생성자 대신 정적 팩토리 메서드를 고려하라장점 - 이름을 가질 수 있다. - 호출될 때 마다 인스턴스를 새로 생성하지 않아도 된다. - 반환 타입의 하위 타입 객체를 반환할 수 있다. - 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다. - 정적 팩토리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.단점 - 상속을 하려면 public이나 protected 생성자가 필요하니 정적 팩토리 메서드만 제공하면 하위 클래스를 만들 수 없다. - 사용자가 찾기가 어렵다. 생성자에 매개변수가 많다면 빌더를 고려하라점층적 생성자 패턴 - 매개변수 개수가 많아지면 코드를 작성하거나 읽기 어렵다.자바빈즈 패턴(setter method 사용) - 객체 하나를 만들려면 메서드를 여러 ..