Posts 2020년 12월 16일, Daily Comment
Post
Cancel

2020년 12월 16일, Daily Comment

올바른 Null Check 습관을 갖자

  1. 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()
      


  2. 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))
    


  3. 문자열 비교시 체크하고자하는 문자열이나 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
    
  4. Return Type이 컬렉션일 경우 null이 아닌 빈 컬렉션을 반환하자.
    • 단 빈 컬렉션을 생성하지말고 각 Util 클래스에서 제공하는 정적메서드를 이용해서 반환하자
      ( 빈 컬렉션을 새로 생성하지 않는다 )

  5. 불가피하게 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이 일어나지 않는다. ( 성능에 좋다. )
This post is licensed under CC BY 4.0 by the author.