Dev Book Review/Effective Java Dev Book Review/Effective Java 2020. 4. 15. [Effective Java] item6. 불필요한 객체 생성을 피하라 1. 객체 재사용 똑같은 기능의 객체를 매번 사용하기 보다는 객체 하나를 재사용하는 편이 나을 때가 많다. 불변 객체는 언제든 재사용가능하다. String s = new String("hello");// Heap 영역에 존재 String s = "hello"; // String constant pool 영역에 존재 (Perm > Heap) 같은 JVM에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재 사용함이 보장된다. string constant pool 영역에 있는지 검색 한 후에, String 객체를 재 사용한다. (== 비교 가능해진다.) Q. string constant pool 영역이 Perm > Heap 일때 이점 [ Java7 ] A. string constant poo.. Dev Book Review/Effective Java 2020. 4. 15. [Effective Java] item5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식을 사용하자 의존 객체 주입의 형태!! // 정적 유틸리티 클래스 X public class SpellChecker{ private static final Lexicon dictionary = ...; private SpellChecker(){} // 객체 생성 방지 } // 싱글턴 X public class SpellChecker{ private final Lexicon dictionary = ...; private SpellChecker(...){} public static SpellChecker INSTANCE = new SPellChecke.. Dev Book Review/Effective Java 2020. 4. 15. [Effective Java] item4. 인스턴스화를 막으려거든 private 생성자를 사용하라 1. 정적 메서드와 정적 필드만을 담을 클래스의 쓰임새 기본타입 값이나 배열 관련 메서드를 모아 둘 때 (java.lang.Math, java.util.Arrays) 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드(팩터리)를 모아둘 때 (java.util.Collections) final 클래스와 관련한 메서드 2. 인스턴스화를 막는 방법. 정적 멤버만 담을 때는 인스턴스로 만들어 쓰려고 설계한게 아님. 문제 ) 생성자를 명시하지 않을 때 자동으로 기본 생성자가 만들어짐 (인스턴스화가 가능해진다) 해결 ) private 생성자를 추가해서 클래스의 인스턴스 화를 막을 수 있다 상속을 불가능하게 하는 효과 (하위가 상위 생성자 접근을 할 수 없다.) 직관적이지 않을 수 있으니 적절한 주석을 달자 p.. Dev Book Review/Effective Java 2020. 4. 15. [Effective Java] item3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 1. 싱글턴이란? 싱글턴(singleton) : 인스턴스를 오직 하나만 생성할 수 있는 클래스 함수와 같은 무상태(stateless) 객체 - 정적 멤버클래스 이야기인가? (Enum 같은거?) 설계상 유일해야하는 시스템 컴포넌트 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기 어려울 수 있다. : mock 대체가 불가능 2. 방식 1) public static 멤버가 final 필드 Private 생성자가 public static final 필드를 초기화 할 때 딱 한번만 호출된다. 예외 ) 권한이 있는 클라이언트가 리플렉션 API인 AccessibleObject.setAccessible을 이용해 private 생성자를 호출 방어 ) 생성자를 수정해 두 번째 객체 생성때 예외 던지기 pu.. Dev Book Review/Effective Java 2020. 4. 15. [Effective Java] item2. 생성자에 매개변수가 많다면 빌더를 고려해라 정적 팩터리 + 생성자의 제약 = 선택적 매개변수가 많을 때 적절히 대응하기 어렵다 1. 대안A) 점층적 생성자 패턴 (telescoping constructor pattern) 필수 매개변수 + 선택 매개변수 원하는 매개변수를 모두 포함한 생성자 중 가장 짧은 것을 골라 호출한다 권장하지 않는다. 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵다. 관련 코드 : https://github.com/WegraLee/effective-java-3e-source-code/blob/master/src/effectivejava/chapter2/item2/telescopingconstructor/NutritionFacts.java 2. 대안B) 자바빈즈 패턴 (JavaBeans pattern) 자바.. Dev Book Review/Effective Java 2020. 4. 15. [Effective Java] item1. 생성자 대신 정적 팩터리 메서드를 고려하라 1. 정적 팩터리 메서드의 장점 ㄱ. 이름을 가질 수 있다. 생성자정적 팩터리 메서드 시그니처가 같은 생성자가 여러개 필요할 것 같을때 정적 팩터리 메서드를 사용하자 생성자 정적 팩터리 메서드 특징설명 X O 시그니처 1개 N개 ㄴ. 호출될 때 마다 인스턴스를 새로 생성하지 않아도 된다. 불변클래스: 인스턴스를 미리 만들어 놓거나 인스턴스 캐싱으로 재사용하여 불필요한 객체 생성을 피할 수 있다. ex ) Boolean.valueOf(boolean b); 플라이웨이트 패턴 (Flyweight pattern) : 데이터를 공유하여 메모리를 절약하는 패턴, 공통으로 사용되는 객체는 한번만 사용되고 Pool에의해서 관리, 사용된다. (JVM의 String Pool에서 같은 String이 잇는지 먼저 찾는다. [.. 이전 1 ··· 3 4 5 6 다음