728x90
반응형
- close 메서드를 직접 호출하여 닫아주는 자원들이 존재하기 때문에 클라이언트가 놓치기가 쉽다.
- 안전망으로 finalizer를 활용하고 있지만 [아이템8]에서 말했듯 믿을게 못된다.
static void copy(String src, String dst) throws IOException {
InputStream in = new FileInputStream(src);
try {
OutputStream out = new FileOutputStream(dst);
try {
byte[] buf = new byte[BUFFER_SIZE];
int n;
while ((n=in.read(buf)) >= 0){
out.write(buf,0,n);
}
} finally {
out.close();
}
} finally {
in.close();
}
}
- 예외는 try 블록과 finally 블록 모두 발생할 수 있다.
- 스택 추적 내역에 첫 번째 예외에 관한 정보는 남지 않게 되어, 실제 시스템에서의 디버깅을 몸시 어렵게 한다.
- 코드가 너무 지저분하다.
// 복수의 자원을 처리하는 try-with-resources 짧고 매혹적이다 !
static void copy(String src, String dst) throws IOException {
try (InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst);){
byte[] buf = new byte[BUFFER_SIZE];
int n;
while ((n=in.read(buf)) >= 0){
out.write(buf,0,n);
}
}
}
- try-finally로 작성하면 실용적이지 못할 만큼 코드가 지저분해지는 경우라도, try-with-resources로는 정확하고 쉽게 자원을 회수할 수 있다.
참고 자료
Joshua Bloch, 『Effective Java 3/E』, 개앞맵시 옮김, 프로그래밍인사이트(2018)
http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788966262281&orderClick=LEa&Kc=
728x90
반응형
'Java' 카테고리의 다른 글
[Effective Java] 아이템 13. clone 재정의는 주의해서 진행하라. (0) | 2022.05.24 |
---|---|
[Effective Java] 아이템 10. equals는 일반 규약을 지켜 재정의하라. (0) | 2022.05.24 |
[Effective Java] 아이템 7. 다 쓴 객체 참조를 해제하라. (0) | 2022.05.24 |
[Effective Java] 아이템 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. (0) | 2022.05.24 |
[Effective Java] 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라. (0) | 2022.05.24 |