"null"은 "Optional"에서 사용되선 안됩니다.

null로 인해 에러가 발생할 수 있을 때 Optional을 사용하는 것이 Optional의 컨셉입니다. 그런 면에서 null을 대체하며, Optional을 사용한다면 사용하는 쪽에서 이 값이 null일 수도 있다는 걱정이 들게해선 안됩니다. 규칙을 어긴 코드 public void doSomething () { Optional<String> optional = getOptional(); if (optional != null) { // 규칙을 어긴 코드 // optional을 이용해 뭔가 동작을 함 } Optional<String> text = null; // 규칙을 ...

더보기

아파치 공통 라이브러리에서 "DateUtils.truncate"은 사용해선 안됩니다

Java8에 도입된 ZonedDateTime 클래스를 사용하여 날짜를 잘라내는 것이 CommonsLang의 DateUtils 클래스보다 훨씬 빠릅니다. 참고: 이 규칙은 프로젝트의 sonar.java.source의 값이 8보다 낮은 경우(java8) 검사하지 않습니다. 규칙을 어긴 코드 public Date trunc(Date date) { return DateUtils.truncate(date, Calendar.SECOND); // 규칙을 어긴 코드 } 규칙을 준수한 해결책 public Date trunc(Date date) { Instant instant = date.toInstant(); ...

더보기

람다에선 타입을 사용하는 것이 좋습니다.

코딩 컨벤션을 공유하는 것은 팀의 협업을 효과적이게 하는데 도움이 될 수 있습니다. 람다 인수에 타입을 적용하는 것은 선택 사항이지만, 코드를 더 명확하고 쉽게 읽을 수 있게 해줍니다. 규칙을 어긴 코드 Arrays.sort(rosterAsArray, (a, b) -> { // 규칙을 어긴 코드 return a.getBirthday().compareTo(b.getBirthday()); } ); 규칙을 준수한 해결책 Arrays.sort(rosterAsArray, (Person a, Person b) -> { return a.getBirthday().compareTo(b...

더보기

"java.time"은 날짜와 시간을 표기하는데에만 사용되어야 합니다

Date와 Calendar 클래스는 낡고, 비웃음을 많이 받아온 클래스입니다. 특히 이 클래스들은 멀티 스레드 환경에서 항상 혼란스럽고 적절하게 사용하기가 어려웠습니다. 이를 대체하기 위해 JodaTime이 많이 사용되었지만, 이제는 훨씬 더 나은 선택지가 내장되어 있습니다. Java 8의 JSR 310 부터는 다음과 같은 클래스들을 제공합니다. 클래스 사용처 LocalDate a date, without time of day, offset, or zone LocalTime the tim...

더보기

Try-with-resources 구문을 사용하는 것이 좋습니다.

Java 7부터 Closeable 리소스가 안전히 종료되는 것을 보장하는 try-with-resources 구문을 도입했습니다. 새로운 구문은 방탄 조끼에 가깝기 때문에, 이전 버전의 try/catch/finally을 사용하는 것보다 선호되어야 합니다. 이 규칙은 Closeable 리소스가 try-with-resources구문에서 열려 있는지를 확인합니다. 참고: 이 규칙은 프로젝트의 sonar.java.source의 값이 7보다 낮은 경우(java7) 자동으로 비활성화됩니다. 규칙을 어긴 코드 FileReader fr = null; BufferedReader br = null; try { fr = ne...

더보기

표준 Functional Interface들을 재정의하면 안 됩니다.

커스텀한 String 클래스를 작성할 이유가 없는 것처럼, 기존의 표준 Functional Interface 를 다시 정의할 이유가 없습니다. 이름을 새로 지음으로서 약간의 추가적인 문맥을 더 넣어 줄 수 있기 때문에, 그렇게 하는 것이 매력적이게 보일 수 있습니다. 하지만 장기적으로 유지 보수를 하는 프로그래머들이 재정의 된 Functional Interface와 표준 Functional Interface가 뭐가 다른지 궁금해 할 수 있고, 혼란의 원인이 될 수 있습니다. 규칙을 어긴 코드 @FunctionalInterface public interface MyInterface { // 규칙을 어긴 코드 ...

더보기

Lambdas 대신 메소드 참조를 사용하는게 좋습니다.

메소드/생성자 참조는 일반적으로 람다를 사용하는 것보다 더 간결하고 가독성이 높아지므로, 이를 사용하는 것이 좋습니다. 드물게 어떤 종류의 함수인지 더 구체적으로 설명하기위해 람다를 유지하는게 괜찮을 수도 있습니다. 마찬가지로 null 체크는 Objects::isNull 또는 Objects::nonNull 메서드에 대한 참조로 대체할 수 있으며, 타입 캐스팅은 SomeClass.class::cast로 변경할 수 있습니다. 더불어 instanceof는 인스턴스는 SomeClass.class::isInstance로 대체할 수 있습니다. 참고: 이 규칙은 프로젝트의 sonar.java.source의 값이 8보다 낮...

더보기

람다를 사용할 때, 입력 매개 변수가 하나라면 괄호를 제거해야 합니다.

람다가 입력 매개 변수를 하나만 가지고 있을 때, 이를 표현할 수 있는 방법이 두가지 있습니다. 매개변수에 괄호를 씌우는 방법과 안씌우는 방법. 이렇게 두가지입니다. 더 간단한 구문은 괄호를 사용하지 않는 것입니다. 괄호가 있는 것보다 훨씬 간결하고 가독성도 좋습니다. 그러므로 이를 사용하는 것이 좋습니다. 참고: 이 규칙은 프로젝트의 sonar.java.source의 값이 8보다 낮은 경우(java8) 자동으로 비활성화됩니다. 규칙을 어긴 코드 (x) -> x * 2 규칙을 준수한 해결책 x -> x * 2 If you like SONARKUBE, don’t forget to giv...

더보기