Finalizer 와 cleaner 는 예측할 수 없고, 느리고 일반적으로 불필요하다. 왜 사용되지 않는지 단점들을 알아보자. 즉시 수행된다는 보장이 없다. finalizer와 cleaner는 즉시 수행된다는 보장이 없기 때문에, 제때 실행되어야 하는 작업은 절대 할 수 없다. 수행 여부조차 보장하지 않는다. 수행 여부조차 보장하지 않는다. 따라서 프로그램 생애주기와 상관없는, 상태를 영구적으로 수정하는 작업에서는 finalizer나 cleaner에 의존해서는 안된다. 성능문제 try-with-resources 로 자신을 닫도록 하여 가비지 컬렉터가 수거하는 것보다, finalizer와 cleaner을 사용한 객체를 생성하고 파괴하는것이 훨씬 더 비효율적이다. 보안문제 생성자나 직렬화 과정에서 예외가 발..
자바는 가비지 컬렉터를 갖춘 언어로 다 쓴 객체를 알아서 회수해준다. 그렇다고 메모리 관리에 더 이상 신경을 쓰지않아도 되는건 아니다. 그 이유는 스택을 간단히 구현한 코드로 살펴보자 public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (size..
item 6. 불필요한 객체 생성을 피하라 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다. 문자열 자바의 String은 String Pool 에서 관리되어 동일한 문자열은 하나로 관리된다. 하지만 new 로 String을 생성하게 되면 동일한 문자열 이라도 새로 인스턴스를 생성하기 때문에 불필요한 객체를 생성하는 것이다. // 이 방법은 좋지않다. String s = new String("test"); // 이 방법 사용 String s = "test"; 정규식, Pattern static boolean isRomanNumeral(String s) { return s.matches("^(?=.)M*(C[MD]|D?C{0,3})" + "(X[CL]|L?X{0,3})(..
사용하는 자원에 따라 동작이 달라지는 클래스는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. 정적 유틸리티 public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} // 객체 생성 방지 public static boolean isValid(String word) { ... } public static List suggestions(String typo) { ... } } 싱글턴 public class SpellChecker { private final Lexicon dictionary = ...; private SpellChecker(...) {} public static S..