똑같은 기능의 객체를 매번 생성하기 보다는, 객체 하나를 재사용하는 편이 나을 때가 많다.
String s = new String("bikini");
bikini
자체가 이 생성자로 만들어내려는 String
과 기능적으로 완전히 같다.String s = "bikini";
String
인스턴스를 사용한다.
생성자 대신 정적 팩터리 메서드를 제공하는 불변 클래스에서는 정적 팩터리 메서드를 사용해서 불필요한 객체 생성을 피할 수 있다!
생성자는 호출할 때마다 새로운 객체를 만들지만, 팩터리 메서드는 전혀 그렇지 않다.
생성비용이 아주 비싼 객체도 있다.
ex) 정규표현식을 이용하여 주어진 문자열이 유효한 로마 숫자인지 확인하는 메서드
static boolean isRomanNumeral(final String s) {
return s.matches("^(?=.)M*(C[MD]|D?C{0,3})"
+ "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
}
문자열 형태를 확인하는 가장 쉬운 방법이지만, 성능이 중요한 상황에서는 반복해서 사용하기 적합하지 않다.
Pattern
인스턴스는 한 번 쓰고 버려져서 곧바로 가비지 컬렉션 대상이 된다.Pattern
은 유한 상태 머신(finite state machine)을 만들기 때문에 인스턴스 생성 비용이 높다!성능을 개선하려면, 필요한 정규표현식을 표현하는 불변인 Pattern
인스턴스를 클래스 초기화 과정에서 직접 생성해 캐싱해 둔다.