본문 바로가기
728x90

JAVA/Effective Java65

item 5. 자원을 직접 명시하지 말고 '의존 객체 주입'을 사용하라. Q. Singleton, static utility Class는 언제나 사용자, 프로그래머에게 유용할까? A) NO! 클래스가 하나 이상의 자원에 의존하고, 해당 자원이 클래스의 동작에 영향을 주는 경우에는 적합하지 않다. 즉, 사용하는 자원에 따라 동작이 달라지는 클래스에는 적합하지 않다. * 잘못 사용한 경우 // 부적절한 static 유틸리티 사용 예 - 유연하지 않고 테스트 할 수 없다. public class SpellChecker { private static final Lexicon dictionary = new KoreanDicationry(); private SpellChecker() { // Noninstantiable } public static boolean isValid(Strin.. 2022. 4. 12.
item 4. 인스턴스화를 막으려면 private 생성자를 사용하라. 정적 멤버(정적 메서드, 정적 필드)만 담은 유틸리티 클래스 특징 static 선언을 통해 인스턴스를 생성하지 않고 전역 범위에서 사용할 수 있고, 재사용이 가능하게 한다. class field와 method 모두 정적으로 구현되어 있는 경우가 많다. 주로 사용하는 경우 기본 타입 값이나 배열 관련 메서드를 모아놓을 때 (Java.lang.Math, Java.util.Arrays) 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아놓을 때 (Java.util.Collections) final Class와 관련된 메서드를 모아놓을 때 (- final class를 상속해서 하위 class 메서드에 넣는것이 불가능함) 단점 인스턴스로 만들어 쓰기 위해 설계한 클래스가 아님에도 인스턴스를 만들 수 .. 2022. 4. 12.
item 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라. * 싱글턴 이란? 인스턴스를 오직 하나만 생성할 수 있는 클래스. 그러나, 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트 하기가 어렵다. 객체를 한 번만 생성하기 때문에 재사용이 가능하다. 메모리 낭비를 막을 수 있고, 전역성을 가져 다른 객체와 공유가 가능하다. * 싱글턴을 만드는 방식 3가지 방법 1, 2를 통해 만든 싱글턴 클래스를 직렬화 하기 위해서는 모든 instance를 transient (직렬화 하지 않겠다는 의미) 선언하고, readResolve 메서드를 제공해야만 역 직렬화 시 새로운 인스턴스가 만들어짐을 방지할 수 있다. 그렇지 않으면, 초기화해둔 인스턴스가 아닌 다른 인스턴스가 반환된다.(약간 복잡) 직렬화(Serialization): 객체를 데이터 스트림으로 만드는 것.. 2022. 4. 9.
item 2. 생성자에 매개 변수가 많다면 빌더를 고려하라 * 선택적 매개변수가 많은 경우 점층적 생성자 패턴 필수 매개변수, 필수+선택 1개, 필수+선택n개 ... 형태로 생성자를 늘려가는 방식. 즉, 매개변수를 최소한으로 사용하는 생성자를 만드는 것이다. 사용자가 설정하고자 하지 않는 매개변수에도 값을 지정해 주어야 함. 보통 0을 넘긴다. 클라이언트 코드를 작성하고, 읽는 것이 어렵다. /* 점층적 생성자 패턴 */ public static class BookGuide1{ private final int day; private final int price; private final int publish; private final int order; public BookGuide1(int day, int price) { // 필수 매개변수 this(day, .. 2022. 4. 9.
item 1. 생성자 대신 정적 팩토리 메소드를 고려하라 * 정적 팩토리 메서드 (static factory method) ? : public 생성자와 별도로 해당 클래스의 instance를 반환하는 정적 메소드. public 생성자 대신 or 같이 사용 가능. * 장점 이름을 가질 수 있다. 메서드에 이름을 부여함으로써 반환될 객체의 특성을 잘 나타낼 수 있음. 한 class 내에서 시그니처가 같은 생성자가 여러 개 필요한 경우에 사용 똑같은 type을 파라미터로 받는 생성자를 두개 이상 만들 수 없는 제약 조건이 있으므로, 이 경우에 사용하면 좋다. 즉, 매개 변수의 타입,개수가 같은 생성자도 만들 수 있다. ublic static void main(String[] args) { Book book1 = new Book("Effective java"); Bo.. 2022. 4. 7.
728x90