요약
변경되지 않는 객체를 사용할 때마다 새로운 객체를 만들지 말자.
불필요한 객체 생성을 하는 예시
String
1 2
| String bad = new String("bikini"); String good = "bikini";
|
new String(“bikini”)로 문자열을 만드는 경우 불필요한 문자열 객체를 만든다.
왜? “bikini”라는 코드 자체가 문자열 객체를 만들기 때문이다.
문자열 객체를 만들고 다시 새로운 객체로 만드는 코드인 셈이다.
반면 두번째 줄 코드는 가상 머신에서 문자열 리터럴을 하나 만들어서 재사용한다.
1 2 3
| for (int i = 0; i < 100; i++) { new String("bikini"); }
|
반복문에 위처럼 문자열 객체를 만들면 불필요한 객체가 생기게 된다.
정적 팩터리 메서드로 불변 클래스 효율적으로 만들기
1 2
| Boolean trueBoolean = new Boolean("true"); Boolean falseBoolean = Boolean.of("false");
|
Boolean 클래스는 객체 내부가 변경되지 않는 불변 객체이다.
불변 객체는 굳이 사용할 때마다 객체를 만들어주지 않아도 된다.
새로운 객체를 만들기보다는 만들어진 객체를 반환하는 기능을 정적 팩터리 메서드로 할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| public final class Boolean implements java.io.Serializable, Comparable<Boolean>, Constable { public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
@SuppressWarnings("unchecked") public static final Class<Boolean> TYPE = (Class<Boolean>) Class.getPrimitiveClass("boolean"); private final boolean value;
@java.io.Serial private static final long serialVersionUID = -3665804199014368530L;
@Deprecated(since="9") public Boolean(boolean value) { this.value = value; }
@Deprecated(since="9") public Boolean(String s) { this(parseBoolean(s)); }
public static Boolean valueOf(String s) { return parseBoolean(s) ? TRUE : FALSE; } }
|
Boolean 객체 내부를 보면 자신의 인스턴스들을 내부에서 클래스 변수로 가지고 있다.
정적 팩터리 메서드로 전달받은 인수에 맞는 인스턴스를 반환해주면 된다.