equals를 재정의할 때는 일반 규약을 따르자

이펙티브 자바! equals를 재정의할 때는 일반 규약을 따르자 equals 메서드는 재정의하기 쉬워 보이지만 실수할 여지가 많다. 만약 재정의 하지 않는다면 그 경우에는 자기 자신하고만 같다. 만약 아래 조건이 부합한다면 그래도 된다. 1. 각각의 객체가 고유하다. 2. 클래스에 논리적 동일성 검사 방법이 있건 없건 상관 없다. 3. 상위 클래스에서 재정의한 equals가 하위 클래스에서 사용하기에도 적합하다. 4. 클래스가 private 또는 packing-private선언 되고 equals메서드를 호출할 일이 없다. equals 메서드는 동치 관계를 구현한다. 1… Read More

private 생성자를 사용하자

제목이 조금 이상하긴한데.. 모든 클래스에 해당되는 말은 당연히 아니다 우리가 흔히 쓰는 유틸 클래스 상태가 없는 클래스들을 말하는거다. 해당 클래스들은 모두 static 메소드를 이루어져 있다. 객체를 인스턴스할 필요가 없는 클래스들 이다. 흔히 유틸 클래스를 만들 때 인스턴스화를 막기 위해 클래스의 abstract 선언하곤 한다. abstract 선언해도 인스턴스를 생성 할 수 있다. 예를 들어 보자 @Test public void test() { ReflectionClass reflectionClass = new ReflectionClass() { }; reflectionClass.printName(“wonwoo”); } abstract class ReflectionClass.. Read More

spring jpa의 patch때 사용하는 유틸

회사에서 잉여짓만하는구만ㅠㅠ 스프링 jpa를 쓰다보면 뭐 form으로 전달하는 것은 상관이 없는데 API 를만들다보면 업데이트시 null로 오면 null을 업데이트 한다. 그래서 옛날객체의 새로운 객체를 넣어 주어 update 하는 방식으로 해왔다. 예를 들어 이런 방식이다. if(account.getName() == null){ oldAccount.setName(account.getName()) } 필드가 많다보면 이것도 일이다. notnull은 상관없는데 null을 허용하는 것들이 문제다. 그래서 유틸로 만들었다. public static <T> void oldInstanceBynewInstance(T oldInstance, T newInstance) { Class<?> newInstanceClass = newInstance.getClass(); Class<?> oldInstanceClass = oldInstance.getClass(); if(!newInstanceClass.isAssignableFrom(oldInstanceClass)){ return;.. Read More