반응형
- 불필요한 객체 생성을 피하자2021-03-15 12:30:14같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다. 재사용은 빠르고 세련되며 불변 객체는 언제든 재사용할 수 있다. 생성자 대신 정적 팩터리 메서드를 제공하는 불변 클래스에서 정적 팩터리 메서의 사용은 불필요한 객체 생성을 피할 수 있다. 생성자는 호출할 때마다 객체를 만들지만, 팩터리 메서드는 그렇지 않다. 불변 객체만이 아니라 가변 객체라 해도 사용중에 변경되지 않을 것임을 안다면 재사용할 수 있다. 생성 비용이 비싼 객체가 반복해서 필요하다면 캐싱하여 재사용하는 것이 권장된다. 문자열이 유효한 로마 숫자인지를 확인하는 정규표현식 메서드를 작성할 때 String.matches 메서드를 성능이 중요한 상황에 반복해서 사용하기엔 적합하지 않기 때문에 메서드가 내부에서 만..
- 자원을 직접 명시하지 말고 의존 객체 주입을 사용하자2021-03-15 11:59:44많은 클래스가 하나 이상의 자원에 의존하는데, 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식은 적합하지 않다.(final 한정자를 제거하고 다른 객체로 교체하는 메서드를 추가할 수 있지만, 오류를 내기 쉬우며 멀티스레트 환경에서 쓸 수 없다) 이런 클래스는 여러 자원 인스턴스를 지원해야 하며, 클라이언트가 원하는 자원을 사용해 한다. 이러한 방식을 만족하는 간단한 방식은 인스턴스 생성시 생성자에 필요한 자원을 넘겨주는 것이다. 이 방식은 자원이 몇 개든 의존 관계가 어떻든 상관없이 잘 동작하며, 불변을 보장하여 여러 클라이언트에서 의존 객체들을 안심하고 공유할 수 있다. 의존 객체 주입은 생성자,정적 팩터리, 빌더 모두에 똑같이 응용할 수 있다. 이 패턴의 쓸만한 변..
- 인스턴스화를 막으려거든 private 생성자를 사용하자2021-03-15 09:20:33남용하면 좋지 않지만 단순히 정적 메서드와 정적 필드만을 담은 클래스를 만들 수 있는데 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아 두거나 final 클래스를 상속해서 하위 클래스에서 메서드를 넣는 건 불가능하기 때문에 final 클래스와 관련한 메서드를 모아둘 수 있다. 이러한 유틸리티 클래스들은 인스턴스로 만들어 쓰려고 설계한 것이 아니다. 추상 클래스로 만든느 것은 인스턴스화를 막을 수가 없다 ( 하위 클래스를 만들어 인스턴스화 할 수 있기 때문에) 컴파일러가 명시된 생성자가 없을때 기본 생성자를 만들려고 하기 때문에 private 생성자를 명시적으로 추가하면 클래스의 인스턴스화를 막을 수 있다. public class Utility{ private Utility(){ throw..
- private 생성자나 열거 타입으로 싱글턴임을 보증하자2021-03-15 01:42:39싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글턴의 전형적인 예로는 함수와 같은 무상태 객체나 설계상 유일해야 하는 시스템 컴포넌트를 들 수 있다. 클래스를 싱클턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다. 왜냐하면 테스트시 인스턴스를 mock 구현으로 대체할 수 없기 때문이다. 싱글턴을 만들시 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련해둔다. public static final 필드 방식의 싱글턴 ( reflection을 사용하면 private 생성자를 호출 할 수있다) 이 방식은 api에 싱글턴임이 명백히 들어나며, 간결하다 정적 팩터리 방식의 싱글턴( 항상 같은 객체의..
반응형