programming (23) 썸네일형 리스트형 Item 8. finalizer와 cleaner의 사용을 피하라 [Why] 위험하기 때문이다. (예측 불가능, 느림) 즉시 수행되지 않는다. 수행 시점 뿐만 아니라 수행 여부도 보장하지 않는다. finalizer는 보안 문제를 일으킬 가능성이 있다. [When] 되도록 사용하지 않는 것을 권장 제 때 실행되어야 하는 작업은 반드시 피하라 상태를 영구적으로 수정하는 작업은 반드시 피하라 [How] AutoCloseable을 구현하고 close 메서드를 호출하는 방법을 사용하라. 프로그래머의 실수를 방지하는 용도로 사용하라 close 메서드 호출을 하지 않는 경우에는 객체를 방치하는 것보다 finalizer, cleaner를 통해서 객체를 닫는 안전망을 추가하는 것이 낫다. 가비지 컬렉터가 접근하지 못하는 네이티브 피어와 연결된 객체를 회수할 때 사용하라. 단 이 경우도.. Item7. 다 쓴 객체 참조를 해제하라 [Why] 객체 참조를 가지고 있는 객체는 가비지 컬랙터의 메모리 회수 대상에서 제외되기 때문에 메모리가 부족할 경우가 발생할 수 있기 때문 [When] 객체를 더 이상 사용하지 않을 때 객체를 캐시할 때 [How] 참조를 다쓰면 null을 통해서 참조 해제를 한다. WeekHashMap 을 통해서 객체를 캐시한다. java.lang.ref 패키지를 활용한다. Item 6. 불필요한 객체 생성을 피하라 [Why] 객체의 생성 비용이 비싸기 때문에. [When] 객체의 생성 비용이 어플리케이션의 성능에 큰 영향을 미칠 때 객체 재사용의 이득이 객체 재생산의 이점(유지보수성, jvm 최적화된 객체 생성 시간)보다 큰 경우 [How] 객체 풀에 객체를 등록하고 사용할 때 객체 풀에 객체를 꺼내서 사용한다. [Example] Pattern Pattern 객체 생성 비용이 크기 때문에 이점이 있다. before static boolean isRomanNumeral(String s){ return s.matches("^(?=.)M*(C[MD]|D?C{0,3}" + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$"); } after public class RomanNumerals{ private st.. Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 [Why] 클래스의 유연성, 재사용성, 테스트 용이성이 개선되기 때문 [When] 사용하는 자원(상태)에 따라 동작이 달라지는 클래스 [How] 의존성의 복잡도를 해결하기 위해서 Spring 과 같은 프레임워크를 사용한다. 생성자, 정적 팩터리, 빌더 패턴 등 객체 생성 관련 메서드에 필요한 자원을 파라미터로 제공한다. Item4. 인스턴스화를 막으려거든 pricate 생성자를 사용하라 [Why] 정적 멤버나 정적 메서드로 구성된 유틸리티 클래스는 인스턴스로 사용하지 않도록 설계한 경우가 있다. 이렇게 인스턴스를 막게 설계된 클래스를 설계한데로 사용하기 위해서 [When] 객체 생성을 제한하고 싶을 때 유틸리티 클래스의 인스턴스화를 막고 싶을 때 [How] private 생성자를 통해서 클라이언트가 객체를 생성하지 못하도록 명시한다. Item 55. 옵셔널 반환은 신중히 하라 [WHY] Optional을 사용한다고 무조건 득이 되는 것이 아니기 때문이다. Collection, Stream, 배열, Optional 같은 컨테이너 타입은 Optional을 사용할 필요가 없다. Wrapper 클래스에 Optional을 적용하는 것 보다 Primitive 타입을 Optional에서 사용하도록 구현한 OptionalInt와 같은 클래스를 사용하는 것이 좋기 때문 null을 박싱한 Optinal을 사용하면 안되기 때문 [WHEN] 결과가 없을 수 있으며, 클라이언트가 이 상황을 특별하게 처리해야 하는 경우 사용자에게 반환 값의 여부를 확인해야 한다는 것을 명시하는 상황 [HOW] Optional 의 메서드를 활용하자. get() 값을 조회한다. orElse() 값을 조회한다. 없다면 기.. Item 54. null이 아닌, 빈 컬렉션이나 배열을 반환하라 [WHY] 1. null을 반환하는 메서드를 사용할 때면 방어 코드를 넣어야 하기 때문이다. - 코드가 지저분해주고 API를 사용하는 사용자 입장에서 사용하기 어렵다. - 잘못된 사용으로 버그의 원인이 될 가능성이 있다. 2. null을 반환함으로서 객체 생성 비용을 줄여 성능에 도움을 줄 수 있으나 더 좋은 기법이 있기 때문이다. [WHEN] 컬렉션이나 배열을 반환할 때 [HOW] 1. 간단한 방법 컬렉션 : 빈 컬렉션을 반환할 때마다 생성하여 요소의 개수가 0개이든 N개이든 넣어서 반환한다. private final List cheeseInStock = new LinkedList(); public List getCheese() { return new ArrayList(cheeseInStock); } .. Item 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴 클래스를 만드는 방법 1. public static final 필드 public class Elvis { public static final Elvis INSTANCE = new Elvis(); public void leaveTheBuilding(){ } } AccessibleOject.setAccessible을 사용해 private 생성자를 호출할 가능성이 존재함 싱글턴임이 API에 명백히 드러난다. 간결하다. 2. 정적 팩터리 방식 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis(){} public static Elvis getInstance(){ return INSTANCE; }//Supp.. 이전 1 2 3 다음