Effective Java 관점에서 Kotlin

13278 단어 KotlinJava
이것은 Kotlin Advent Calendar 2017 18일째 보도입니다 (투고가 늦었습니다, 스미슨
자바 엔지니어가 반드시 읽어야 할 Effective Java 관점으로 Kotlin을 살펴보면 Kotlin이 매우 영리하다는 것을 발견할 수 있다.
여기서 Effective Java 3장의 프로젝트 8, 프로젝트 9의 equalshashCode의 Override를 골라보겠습니다.

equals와 hashCode의 Override.


개요


제3장 프로젝트 8, 프로젝트 9를 복습해 보세요.
대충 다음과 같은 내용이 적혀 있다.
  • 희망류가 논리적 등가성 개념을 가지면 equalsoverride.
  • equals 방법은 다음과 같은 일반 계약을 만족시켜야 한다
  • 반사적, 대비적, 추이적, 일치적, non nullxx.equals(null)※ 자세한 정보를 알고 싶으신 분은 찾아보세요

  • 덮어쓰는 경우false, equals 덮어쓰는 경우
  • Java로 구현


    Java로 설치를 시도하면 다음과 같이 설치를 시도합니다.
    public class DataA {
        @NotNull
        private final String a;
        @NotNull
        private final String b;
        @Nullable
        private final String c;
    
        public DataA(@NotNull String a, @NotNull String b, @Nullable String c) {
            this.a = a;
            this.b = b;
            this.c = c;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
    
            DataA dataA = (DataA) o;
    
            if (!a.equals(dataA.a)) return false;
            if (!b.equals(dataA.b)) return false;
            return c != null ? c.equals(dataA.c) : dataA.c == null;
        }
    
        @Override
        public int hashCode() {
            int result = a.hashCode();
            result = 31 * result + b.hashCode();
            result = 31 * result + (c != null ? c.hashCode() : 0);
            return result;
        }
    }
    
    
    참고로 hashCodeequals 은 IntelliJ에서 자동으로 생성됩니다.
    그렇다면 이후 학급에 필드 등을 추가하는 등 변경한 상황에서 이것hashCodeequals이 당초 예상한 규격을 계속 충족시킬 수 있을까.
    이것은 실제 설치자에게 의뢰하여 반드시 의식하고 준수해야 하는 부분이 된다

    Kotlin으로 설치


    이게 Kotlin이라면 어떨까요?
    data class DataB(
            val a: String,
            val b: String,
            val c: String?
    )
    
    당신이 알고 있는 hashCode 를 사용하면 됩니다
    이것을 진단해 봅시다.
    public final class DataB {
       @NotNull
       private final String a;
       @NotNull
       private final String b;
       @Nullable
       private final String c;
    
       ...
    
       public int hashCode() {
          return ((this.a != null ? this.a.hashCode() : 0) * 31 + (this.b != null ? this.b.hashCode() : 0)) * 31 + (this.c != null ? this.c.hashCode() : 0);
       }
    
       public boolean equals(Object var1) {
          if (this != var1) {
             if (var1 instanceof DataB) {
                DataB var2 = (DataB)var1;
                if (Intrinsics.areEqual(this.a, var2.a) && Intrinsics.areEqual(this.b, var2.b) && Intrinsics.areEqual(this.c, var2.c)) {
                   return true;
                }
             }
    
             return false;
          } else {
             return true;
          }
       }
    }
    
    
    
    data class 하고 equals 다 했어요.
    그리고 자바의 자동 생성 코드와 같다...그렇게 지도 모른다, 아마, 아마...(확인 안 됨
    (´-`)oO(hashCode, NonNull의 field도 null을 검사하는구나)
    이로써 Kotlin의 hashCode 자동 설치data classequals 때문에 학급을 변경해도 당초의 규격을 계속 준수하기 쉽다.

    겸사겸사 말씀드리다

    hashCodeequals Override 사용 가능Lombok
    (Lombok의 기능과 Kotlin을 비교해도 재미있죠?)

    끝날 때


    이번에는 hashCodeequals밖에 없지만 Kotlin은 EffectiveJava를 실천하는 데 매우 편리한 기능이 많다.
    영리하게 하는 것을 이해할 수 있기 때문에 Effective Java에 비해 Kotlin의 언어 기능을 보는 것도 재미있다.
    참고로 Effective Java는 오래전에 출판되었고 내용도 오래된 부분이 있습니다. 하지만 곧 3판이 발매됩니다. 관심 있으신 분들은 꼭!
    https://www.amazon.co.jp/Effective-Java-3rd-Joshua-Bloch/dp/0134685997

    참고 자료

    좋은 웹페이지 즐겨찾기