코드가 getter와 fields를 섞어서 NPE를 던졌습니다.
정말 많은 방법이 필요합니까, 아니면 더 일반적인 하나의 방법이 필요합니까?
나는 많은 방법들이 유용하기 때문에 후자를 강력히 선호한다. 호출자가 필요하고 코드가 커지게된다.
이렇게하려면 반사 또는 주석 처리를 사용할 수 있습니다. 리플렉션에는 약간의 런타임 오버 헤드가 있습니다 (예전만큼 나쁜 것은 아니지만) 보안 관리자가 금지하지 않는 한 비공개 멤버에 액세스 할 수 있습니다. 다음과 같은
뭔가 내가 불변의 결과를 선호하지만, 필요하지 않은 왜냐면
public static ImmutableSet<String> differingFields(Object o1, Object o2) throws IllegalAccessException {
checkNotNull(o1);
checkNotNull(o2);
checkArgument(o1.getClass() != o2.getClass());
ImmutableSet.Builder<String> result = ImmutableSet.builder();
for (Field f : o1.getClass().getDeclaredFields()) {
f.setAccessible(true);
if (!Objects.equals(f.get(o1), f.get(o2))) {
result.add(f.getName());
}
}
return result.build();
}
그것은 구아바를 사용
을 수행해야합니다. 비효율적 인 것은 autoboxing과 반사 액세스에서 비롯된 것이며 아마 받아 들일 만하다.
정확하게 동일한 클래스의 인스턴스가 전달 될 때만 작동합니다. 상속 된 필드는 무시됩니다. 이것은 쉽게 고칠 수 있습니다.
필드 이름 대신 Guava의 MapDifference
또는 그와 비슷한 값을 반환 할 수 있습니다. differingFields
을 구현하는 대신 개체를지도로 변환하여 작업 할 수 있습니다.
몇 년 동안 이런 일은 절대로 필요하지 않았습니다. 그래서 나는 거의 자동화할만한 가치가없는 경우가 거의 없다고 생각합니다. – Henry
행운 :-) :-) – user7450524