두 가지 선택이 있습니다.
1. 가장 바람직한 방법은 Object 클래스에서`equals ()`메서드를 재정의하는 것입니다.
예를 들어이 Object 클래스가 있다고 가정 해 보겠습니다.
public class MyObject {
private String name;
private String location;
//getters and setters
}
이제 MyObject의 이름에만 관심이 있다고하자. 고유 한 이름이어야하므로 두 개의 MyObject 이름이 같은 경우 동일하다고 간주해야합니다. 이 경우 이름을 비교하여 동등성을 결정하기 위해`equals ()`메소드 (및`hashcode ()`메소드)를 대체하려고합니다.
이 작업을 완료하면 Collection에 이름이 "foo"인 MyObject가 포함되어 있는지 확인할 수 있습니다.
MyObject object = new MyObject();
object.setName("foo");
collection.contains(object);
그러나 다음과 같은 경우에는이 옵션이 적합하지 않을 수 있습니다.
- 이름과 위치를 모두 사용하여 동등성을 확인하고 있지만 Collection에 특정 위치의 MyObject가 있는지 확인하려고합니다. 이 경우 이미 'equals ()'를 재정의했습니다.
- `MyObject`는 자유롭게 변경할 수없는 API의 일부입니다.
이 중 하나에 해당하면 옵션 2를 원할 것입니다.
2. 자신 만의 유틸리티 메소드를 작성하십시오.
public static boolean containsLocation(Collection<MyObject> c, String location) {
for(MyObject o : c) {
if(o != null && o.getLocation.equals(location)) {
return true;
}
}
return false;
}
또는 ArrayList (또는 다른 컬렉션)를 확장 한 다음 고유 한 메서드를 추가 할 수 있습니다.
public boolean containsLocation(String location) {
for(MyObject o : this) {
if(o != null && o.getLocation.equals(location)) {
return true;
}
}
return false;
}
불행히도 그 주위에 더 좋은 방법은 없습니다.