일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- aop
- AWS
- AWS RDS
- 기술면접
- MariaDB
- 자료구조
- 네트워크
- DDD
- 이팩티브 자바
- SQL쿡북
- jpa
- 혼공SQL
- react
- 도메인 주도 개발 시작하기
- 자바예외
- 이펙티브자바
- mysql
- CleanCode
- 알고리즘
- 이펙티브 자바
- 자바스터디
- java
- 인프런백기선
- vue.js
- 스프링부트와AWS로혼자구현하는웹서비스
- 클린코드
- 자바
- 알고리즘분석
- 인덱스
- 인프런김영한
- Today
- Total
목록이펙티브자바 (17)
기록이 힘이다.
//catch 블록을 비워두면 예외가 무시된다. 아주 의심스러운 코드다! try{ ... }catch(SomeException e){ } 예외는 문제 상황에 잘 대처하기 위해 존재하는데 catch 블록을 비워두면 예외가 존재할 이유가 없어진다. 비유하자면 화재경보를 무시하는 수준을 넘어 아예 꺼버려, 다른 누구도 화재가 발생했음을 무시하는 수준을 넘어 아예 꺼버려, 다른 누구도 화재가 발생했음을 알지 못하게 하는 것과 같다. 물론 예외를 무시해야 할 때도 있다. EX) FileInputStream --> 로그 예외를 무시하기로 했다면 catch 블록 안에 그렇게 결정한 이유를 주석으로 남기고 예외 변수의 이름도 ignored로 바꿔놓도록 하자. Future f = exec.submit(planarMap:..
일반화해 이야기하면, 호출된 메서드가 실패하더라도 해당 객체는 메서드 호출 전 상태를 유지해야 한다. => 실패 원자적(failure-atomic) 실패 원자적으로 만드는 방법 1. 불변 객체로 설계하는 것이다.=> 태생적으로 실패 원자적 2. 가변 객체의 메서드를 실패 원자적으로 만드는 가장 흔한 방법은 작업 수행에 앞서 매개변수의 유효성을 검사하는 것이다. 객체의 내부 상태를 변경하기 전에 잠재적 예외의 가능성 대부분을 걸러낼 수 있는 방법이다. ex) TreeMap public Object pop(){ if(size ==0) throw new EmptyStackException(); Object result = elements[--size]; elements[size] = null; // 다 쓴 참..

사후 분석을 위해 실패 순간의 상황을 정확히 포착해 예외의 상세 메시지에 담아야 한다. 실패 순간을 포착하려면 발생한 예외에 관여된 모든 매개변수와 필드의 값을 실패 메시지에 담아야 한다. EX) IndexOutOfBoundsException의 상세 메시지는 범위의 최솟값과 최댓값, 그리고 그 범위를 벗어났다는 인덱스의 값을 담아야 한다. 이 정보는 실패에 관한 많은 것을 알려준다. 예외의 상세 메시지와 최종 사용자에게 보여줄 오류 메시지를 혼동해서는 안 된다. 최종 사용자에게는 친절한 안내 메시지를 보여줘야 하는 반면, 예외 메시지는 가독성보다는 담긴 내용이 훨씬 중요하다. 예를 들어 현재의 IndexOutOfBoundsException 생성자는 String을 받지만, 다음과 같이 구현했어도 좋았을 것..
검사 예외는 항상 따로따로 선언하고, 각 예외가 발생하는 상황을 자바독의 @throws 태그를 사용하여 정확히 문서화하자. 메서드가 던질수 있는 예외를 각각 @throws 태그로 문서화하되, 비검사 예외는 메서드 선언의 throws 목록에 넣지 말자. 검사냐 비검사냐에 따라 API 사용자가 해야 할 일이 달라지므로 이 둘을 확실히 구분해주는 게 좋다. 한 클래스에 정의된 많은 메서드가 같은 이유로 같은 예외를 던진다면 그 예외를 (각각의 메서드가 아닌) 클래스 설명에 추가하는 방법도 있다.
리플렉션은 코어단에서 많이 사용을 한다. 객체를 사용할 때 사용해야 한다. 주의해서 사용하라는 것 같다. 리플랙션을 사용하면 임의의 클래스에 접근가능. 클래스의 Constructor, Method, Field 인스턴스를 가져올수 있음. 각각에 연결된 각 생성자 메서드 필드를 조작할 수 있다. Method.invoke는 어떤 클래스의 어떤 객체가 가진 어떤 메서드라도 호출할 수 있다. 단점! 컴파일타임 타입 검사가 주는 이점을 하나도 누릴 수 없다. 리플랙션으로 없는 메서드를 호출하면 런타임 오류가 발생함. 리플렉션을 이용하면 코드가 지저분하고 장황해진다. 성능이 떨어진다. 프레임워크 단에서 리플랙션을 사용하여 구현하는 로직들이 있음. 이들도 리플랙셔 사용을 지양하는 방향으로 진행되고있음. (단점이 명확하..
표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과 여러분보다 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다. 핵심적인 일과 크게 관련 없는 문제를 해결하느라 시간을 허비하지 않아도 된다는 것이다. 따로 노력하지 않아도 성능이 지속해서 개선된다는 점이다. 기능이 점점 많아진다는 것이다. 여러분이 작성한 코드가 많은 사람에게 낯익은 코드가 된다. 더 읽기 좋고, 유지보수하기 좋고, 재활용하기 쉬운 코드가 된다. 메이저 릴리스마다 주목할 만한 수많은 기능이 라이브러리에 추가된다. 자바 프로그래머라면 적어도 java.lang, java.util, java.io와 그 하위 패키지들에는 익숙해져야 한다. 컬렉션 프레임워크와 스트림 라이브러리, java.util.concurrent의 동시성 기능도..
아이템37 ordinal 인덱싱 대신 EnumMap을 사용하라 class Plant { enum LifeCycle { ANNUAL, PERENNIAL, BIENNIAL } final String name; final LifeCycle lifeCycle; Plant(String name, LifeCycle lifeCycle) { this.name = name; this.lifeCycle = lifeCycle; } @Override public String toString() { return name; } public static void main(String[] args) { Plant[] garden = { new Plant("바질", LifeCycle.ANNUAL), new Plant("캐러웨이", L..