Programming/JAVA
Java HashSet에서 HashCode를 변경하게 되면...
effective java의 item11인 equals 와 hashCode의 재정의에 대해 보던 중 한가지 의문점이 생겼다. HashSet안에 넣은 객체의 equals와 hashCode를 수정하게 됬을때 검색이 되나 .. ? HashSet의 동작방식이 hashCode가 같고 equals가 true로 나오게 되면 가능한 것으로 알고있어서 대충 테스트해보고 되면 넘어가려고 했다. 근데 왠걸... 값과 hashCode를 변경 하면 똑같은 객체로 contains 검색이 안된다. 시나리오는 이랬다. 1. 국어, 수학, 영어 만점을 가진 학생 클래스 (set에 등록) 2. 부정행위로 인해 점수를 반으로 감소시킴 3. 이후 set에 contains로 같은 객체로 존재하는지 hashCode가 변경됬지만 넣어 놓은 객체..
Java Equals 정의시 getClass() or instanceof
이펙티브 자바 아이템 10을 읽던 중 의문점이 하나 생겼다. equals를 재정의 하는 다양한 방법들이 있는데 그 중에는 같은 클래스인지 확인하기 위해 getClass 를 사용하는 경우와 instanceof를 사용하는 경우가 있었다. 책에서는 getClass를 통해 먼저 클래스를 확인하고 이후 값을 비교하게 되면 Liskov의 원칙을 위배하게 된다고 한다. 하지만 IDE 에서 자동 equals 생성을 할 시 class Person { String name; public Person(String name) { this.name = name; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null |..
Objects requireNonNull 란?
Effective Java를 읽던 도중 this.dictionary = Objects.requireNonNull(dictionary); 라는 코드를 읽고 requireNonNull이 궁금해져서 IDE를 통해 구현을 확인했다. @ForceInline public static T requireNonNull(T obj) { if (obj == null) throw new NullPointerException(); return obj; } 확인하고 나니 단순히 Null이면 NPE를 날리는게 무슨 의미가 있는거지 싶어서 찾아보게 됬다. 장점으로는 1. Null-Safe 하게 객체를 사용가능하다. 2. 빠르게 실패를 확인 가능하다. 가 있었다. 먼저, 1번인 Null-Safe야 당연하게 null을 체크하고 난 이후..