Для любых двух классов, например. ClassA
и ClassB
ниже:
class ClassA {
private int intA;
private String strA;
private boolean boolA;
// Constructor
public ClassA (int intA, String strA, boolean boolA) {
this.intA = intA; this.strA = strA; this.boolA = boolA;
} // Getters and setters etc. below...
}
class ClassB {
private int intB;
private String strB;
private boolean boolB;
// Constructor
public ClassB (int intB, String strB, boolean boolB) {
this.intB = intB; this.strB = strB; this.boolB = boolB;
} // Getters and setters etc. below...
}
И любые два разных типа Collection
, один с элементами ClassA
, а другой с элементами ClassB
, например:
List<Object> myList = Arrays.asList(new ClassA(1, "A", true),
new ClassA(2, "B", true));
Set<Object> mySet = new HashSet<Object>(
Arrays.asList(new ClassB(1, "A", false),
new ClassB(2, "B", false)));
Какой самый простой способ сказать, являются ли два Collection
"эквивалентными" (*) в терминах заданного подмножества полей?
(*) Слово "эквивалент" используется, а не "равно", поскольку оно является контекстуальным - то есть такая "эквивалентность" может быть определена по-разному в другом контексте.
Работающий пример сверху:
Предположим, мы укажем, что intA
и strA
должны совпадать с intB
и strB
соответственно (но значения boolA
/boolB
можно игнорировать). Это сделало бы упомянутые выше два объекта коллекции эквивалентными, но если бы элемент был добавлен или удален из одной из коллекций, то они больше не были бы.
Предпочтительное решение: Используемый метод должен быть общим для любого типа Collection
. В идеале Java 7 как-то ограничивается этим (но Java 8 может представлять интерес для других). С удовольствием используем Guava или Apache Commons, но предпочитаем не использовать более неясные внешние библиотеки.