올바른 Null Check 습관을 갖자
toString보다는 String.valueOf()를 사용하자.
- Object.toString()은 Object가 null일 경우 npe를 발생시킨다.
- String.valueOf(Object)는 Object가 null일경우 “null” String을 반환하며,
Null이 아닐경우 toString()을 반환한다.1 2 3
// Worst Object obj = null; String result = obj.toString(); // NPE 발생
1 2 3
// Good Object obj = null; String result = String.valueOf(obj); // safe logic, "null" or toString()
- Object.toString()은 Object가 null일 경우 npe를 발생시킨다.
Null에 안전한 자바 내장 함수나 아파치 commons-lang 라이브러리 같은 helper class를 활용하자.
1 2 3 4
// Worst if(null == Object) if(null == String || String.isEmpty())
1 2 3 4 5 6
// Goods if(Objects.isNull(Object)) if(Objects.nonNull(Object)) if(Objects.requireNonNull(Object)) if(StringUtils.isEmpty(String))
문자열 비교시 체크하고자하는 문자열이나 null이 발생할 가능성 없는 객체를 선행하여 비교하자.
- 선행하는 객체가 null이 아니면, equals method에서 false이 반환된다.
- In equals method
if (anObject instanceof String)
anObject가 null일 경우 해당 조건문은 false
1 2
// Worst if(String.equals("text")) // if String is null, Occurs to NullpointException
1 2
if("text".equals(String)) if("test".equalsIgnoreCase(String)) // 대소문자 상관없이 equals
- 선행하는 객체가 null이 아니면, equals method에서 false이 반환된다.
Return Type이 컬렉션일 경우 null이 아닌 빈 컬렉션을 반환하자.
- 단 빈 컬렉션을 생성하지말고 각 Util 클래스에서 제공하는 정적메서드를 이용해서 반환하자
( 빈 컬렉션을 새로 생성하지 않는다 )
- 단 빈 컬렉션을 생성하지말고 각 Util 클래스에서 제공하는 정적메서드를 이용해서 반환하자
불가피하게 Null을 반환해야할 경우 Optional class 이용
Enum을 이용한 비교시 생각을 다르게 해보기
1
2
// 습관적인 기존 방법
Arrays.stream(Enum.values()).anyMath(t -> t.name().equals(target));
- 모든 Enum의 value를 검사한다.
1
2
// 개선방법 1
Arrays.stream(new Enum[]{Enum.case}).anyMatch(t -> t.name().equals(target));
- 검사하고자 하는 Enum의 case를 줄여본다.
1
2
3
4
5
// 개선방법 2
Map<Enum, ErrorMessage> enumMap = new HashMap<>(); // EnumMap도 가능
if(enumMap.containKey(target)){
...
}
- Map을 인스턴스 변수로 빼두고, 후에 추가,삭제가 용이하게 설계가능
Stream.of vs Arrays.stream
1
2
3
// Stream.of로 스트림 생성
Stream.of(Object, Object...) // Arrays.stream(T[] ...) 호출, stream 생성
Stream.of(123,456,789...) // Arrays.stream(T[] ... ) 호출, stream 생성
1
2
3
// Arrays.stream으로 스트림 생성
Arrays.stream(new Object[]{Object, Object...}) // Arrays.stream(T[] ... ) 호출, stream 생성
Arrays.stream(new int[]{123,456,789...}) // Arrays.stream(int[] ...) 호출, IntStream 생성
- 기본형(int, double, long)에 관한 스트림을 만들때,
Stream.of는 autoBoxing이 일어나지만
Arrays.stream은 autoBoxing이 일어나지 않는다. ( 성능에 좋다. )