티스토리 뷰
![]() |
|
기능적으로 동일한 객체는 필요할 때 마다 만드는 것보다 재사용 하는 편이 낫다.
변경 불가능한(immutable) 객체는 언제나 재사용할 수 있다.
극단적인 예제
String s = new String("stringette");
String 생성자에 전달되는 "stringette" 자체가 string 객체이다.
String s = "stringette";
위 방법이 바람직 하다
또 다른 극단적인 예제
public class Person {
private final Date birthDate;
public boolean isBabyBoomer() {
Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
Date boomStart = gmtCal.getTime();
gmtCal.set(1965, Calendar.JANAUARY, 1, 0, 0, 0);
Date boomEnd = gmtCal.getTima();
return birthDate.compareTo(boomStart) >= 0 && birthDate.compareTo(boomEnd) < 0;
}
}
isBabyBoomer() 가 호출될 때 마다 Calendar 객체, TimeZone 객체, Date객체 가 쓸데없이 만들어 진다. 정적 초기화 블록(static initializer)을 통해 개선하는 것이 좋다.
public class Person {
private final Date birthDate;
private static final Date BOOM_START;
private static final Date BOOM_END;
static {
Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
Date boomStart = gmtCal.getTime();
gmtCal.set(1965, Calendar.JANAUARY, 1, 0, 0, 0);
Date boomEnd = gmtCal.getTima();
}
public boolean isBabyBoomer() {
return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;
}
}
또 다른 극단적인 예
public static void main(String[] args) {
Long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
}
sum 은 Long 이 아니라 long 으로 선언되어야 하는데 Long 으로 선언함으로서 2의31승 개의 객체가 생성되었다. 여기서 얻을 수 있는 교훈은
객체 표현형 대신 가본 자료형을 사용하고, 생각지도 못한 자동 객체화가 발생하지 않도록 유의
'JAVA > Effective Java' 카테고리의 다른 글
규칙8 equals를 재정의할 때는 일반 규약을 따르라 (0) | 2018.12.19 |
---|---|
규칙7 종료자 사용을 피해라 (0) | 2018.12.19 |
규칙6 유효기간이 지난 객체 참조는 폐기하라 (0) | 2018.12.19 |
규칙4 객체 생성을 막을 때는 private 생성자를 사용하라 (0) | 2018.12.19 |
규칙3 private 생성자나 enum 자료형은 싱글턴 패턴을 따르도록 설계하자 (0) | 2018.12.19 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Flux
- Lazy
- rate limit
- custom config data convertion
- reactor
- RouteDefinition
- MariaDB
- notifyAll()
- N+1
- wait()
- referencedColumnName
- spring cloud gateway
- circurit breaker
- mariada-connector
- ConcurrentHashMap
- dynamodb
- ResultSet
- aurora
- DyanomoDB
- Seperate Chaining
- router
- AbstractMethodError
- notify()
- reative
- GlobalFilter
- msyql-connector-java
- RoutePredication
- HashMap
- mariadb-connector-j
- getBoolean
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함