일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- nodeJS
- 자바
- javascript type
- Effective Java
- java.util.LinkedHashMap cannot be cast
- CAS
- webstorm
- Redis
- 이펙티브 자바
- Intellij
- javascript 기초
- spring security
- ES6
- Spring Session
- you don't know js
- javascript value
- javascript 값
- 자바스크립트
- JetBrains
- webpack
- java
- ECMA2015
- Spring
- 이펙티브자바
- javascript native
- spring batch #스프링 배치 #스프링 배치 중복 실행
- requestbody
- javascript
- effectivejava
- Babel
- Today
- Total
목록이펙티브 자바 (11)
귀찮지만 만들어보자
다중정의는 신중히 사용하라 public class CollectionClassfier { public static String classify(Set s) { return "집합"; } public static String classify(list list) { return "리스트"; } public static String classify(Collection c) { return "그 외"; } public static void main(String[] args) { Collection[] collections = { new HashSet(), new ArrayList(), new HashMap().values() }; for (Collecstion c: collections) { System.out..
메서드 시그니처를 신중히 설계하라 - 메서드 이름을 신중히 짓자.이게 제일 어렵다 우웩 - 편의 메서드를 너무 많이 만들지 말자이건 유틸성으로 사용하는 메서드를 만들어서 사용하는 경우뿐만 아니라, 외부 라이브러리를 사용하는 경우 또한 마찬가지다. 자바의 장점이 활용할 수 있는 라이브러리가 많다는 점인데.. 간혹 이게 장점인지 단점인지 분간이 안갈때가 있다. 분명 같은 역할을 하는 유틸인데 spring에서 만든것도 있고, apache에서 만든것도 있고.. 그래서 협업하는 단계에서 골치아플 때가 많다. - 매개변수 목록은 짧게 유지하자4개 이하가 좋다고한다. 과하게 긴 매개변수 목록을 짧게 줄이는 방법 1. 메서드를 쪼갠다 - 여러개의 메서드를 조합해서 사용하는 방식이다. 잘못하면 메서드의 개수만 많아질 수..
적시에 방어적 복사본을 만들라 자바로 작성한 클래스는 시스템의 다른 부분에서 무슨짓을 하든 그 불변식이 지켜진다.하지만 다른 클래스로부터의 침범을 아무런 노력없이 막을 수 있는 건 아니다.클라이언트가 불변식을 깨뜨리려고 혈안이 되어있다고 가정하고 방어적으로 프로그래밍해야한다 그니까 요점은 생성된 객체 내부의 값을 변조할 수 없게 코딩해야한다는 말이다. Date를 매개변수로 받는 경우를 생각해보면, Date는 가변이기 때문에 어렵지 않게 불변식을 깨뜨릴 수 있다.자바8에 추가된 Instant나 LocalDateTime 등을 사용하면 이런 점을 방지할 수 있다.얘네들은 불변이기 때문에 생각해보니 우리 프로젝트는 아직 Date를 사용한다또 다른 방법으로는 매개변수를 그대로 사용하지 않고, 생성자에서 값을 복사..
매개변수가 유효한지 검사하라 메서드 몸체가 시작되기 전에 매개변수를 검사해야한다. 사실은 이게 핵심이다.미리 확인한다면 즉각적이고 깔끔한 방식으로 예외를 던질 수 있다. 매개변수 검사를 제대로 하지 않았을때의 문제점- 메서드가 수행되는 중간에 모호한 예외를 던지며 실패할 수 있다. - 메서드는 잘 수행됐지만 잘못된 결과를 반환할 수 있다. - 메서드에 포함된 객체를 이상한 상태로 만들어놔서 미래의 알수 없는 시점에 메서드와 관련없는 오류를 발생 시킬수있다. 간략하게 정리를 하자면 메서드가 외부의 잘못된 변수로 인해 영향을 받지 않게 해야한다.가장 문제가 자주 발생하는건 null에 대한 처리인데..이 때문에 불변성을 보장해주는 언어가 각광받는게 아닐까 싶다. ex) kotlin, scala 자바7에 추가된..
스트림 병렬화는 주의해서 사용하라 자바5에서는 concurrent 라이브러리, executor 프레임워크자바7에서는 fork / join 그리고자바8에서는 parallel로 벙렬 프로그래밍을 지원한다. 사용하는 것은 간단하게 메서드를 호출하는 것으로 가능하지만,제약 사항이 많고 올바르게 사용하기에는 제약사항이 많다. parallel로 성능개선을 할 수 없는 경우- 데이터 소스가 Stream.iterate 인 경우 - 중간 연산에 limit를 사용하는 경우 - 스틀팀의 소스가 LinkedList와 같이 꼬리를 물고 있는 경우 일반적으로 parallel을 사용해서 성능개선을 할 수 있는 경우- 스트림의 소스가 ArrayList, HashMap, HashSet, ConcurrentHashMap, 배열, int..
반환 타입으로는 스트림보다 컬렉션이 낫다 스트림에서는 일반적인 컬렉션에서 지원하는 iteration(반복)을 제공하지 않는다.사용하지 말라는 가장 큰 이유가 이것이다.스트림 인터페이스는 iterable 인터페이스가 정의한 추상 메서드를 포함할 뿐만아니라,iterable 인터페이스가 정의한 방식대로 동작한다.그럼에도 불구하고 foreach로 스트림을 반복할 수 없는 이유는 스트림이 iterable을 상속받지 않아서다.그러니까 어설프게 스트림을 반환하는 것 보다는 컬렉션이 낫다스트림을 반복처리하도록 만드는 방법이 아예 없진 않지만 어지간하면 지양하자... 원소의 개수가 많다면(ex. 2^30-1) 처리할 수 있는 전용 컬렉션을 구현하거나,그것이 불가능 할 경우에 stream과 iterable 중 더 자연스러..
스트림에서는 부작용 없는 함수를 사용하라 스트림 패러다임의 핵심은 계산을 일련의 변환으로 재구성 하는 부분이다.이전 단계의 결과를 받아서 처리하는 과정에서(method chaining, fluent api) 원활하게 진행되려면,스트림 연산에서 건내지는 함수 객체는 모두 부작용이 없어야 한다.스트림 api를 진행하면서 발생하는 예외에 대한 처리가 까다로운 편이니,연산을 진행하기전에 예외에 대한 처리 또한 미리 하는 것이 좋다. Map freq = new HashMap(); try (Stream words = new Scanner(file).tokens()) { words.forEach(word -> { freq.merge(word.toLowerCase(), 1L, Long::sum); }); }해당 예제에..
스트림은 주의해서 사용하라 스트림은 다량의 데이터 처리 작업을 돕고자 자바8에 추가되었다.이 API에서 제공하는 추상 개념중 핵심은 두 가지다.- 스트림은 데이터 원소의 유한 혹은 무한 시퀀스를 뜻한다 - 스트림 파이프라인은 이 원소들로 수행하는 연산 단계를 표현하는 개념이다 스트림의 파이프라인은 소스 스트림으로 시작해서 종단 연산으로 끝난다. 그 사이에 하나 이상의 중간 연산이 있을 수 있다. 여기서 중간 연산은 스트림이 어떠한 형태로 변환한다. 최종적인 연산의 결과는 종단 연산에서 처리하게 된다.중간 연산이 여러개 존재할 경우에 종단연산에서 지연 평가된다. 사실은 이게 핵심이다! 잘 기억해두자 스트림 API는 메서드 연쇄를 지원하는 플루언트 API이다. 그니까 이어 붙이는게 가능하다.위에서 굵은 글씨..
표준 함수형 인터페이스를 사용하라 필요한 용도에 맞는 게 있다면, 직접적인 구현은 지양하는 것이 좋다.기본적으로 제공되는 표준 함수형 인터페이스 43개나 된다.그러니까 어지간한 경우에는 기본적으로 제공되는 함수형 인터페이스로 커버가 가능하다. 표준 함수형 인터페이스 참조 링크 : https://blog.hanumoka.net/2018/11/24/java-20181124-java-lambda2/ 표준 함수형 인터페이스를 사용해야 하는 이유(필수는 아니고 권장)- api를 다뤄야하는 개념의 수가 줄어들어 더 익히기 쉬워진다 - 표준 함수형 인터페이스는 유용한 디폴트 메서드를 많이 제공하기 때문에, 다른 코드와 상호 운용성도 좋아질 것이다 유의사항 1. 표준 함수형 인터페이스를 사용할 때 박싱된 기본 타입을 ..
람다보다는 메서드 참조(method reference)를 사용하라 일반적으로 사용하는 람다보다 더 간결하게 만드는 방법이다 - 예시map.merge(key, 1, (count, inc) -> count + incr); map.merge(key, 1, Integer::sum); 이런식으로 더욱 간결하게 사용할 수 있다. 인텔리제이에서 다 만들어주더라 다른 IDE도 되겠지..? 하지만 무조건적으로 간결해지는 것은 아니다.- 예시service.execute(GoshThisClassNameIsHumongous::action); service.execute(() -> action()); 이럴 경우에는 람다보다 메서드 참조가 더욱 알아먹기 어렵다.. 그러니까 적절하게 선택해서 사용하자. 람다로도는 불가능하지만 메서..