Можно ли использовать интерфейс в качестве ключа в Coherence Cache?

У меня есть 2 разных типа ключей:

interface Key extends Serializable {
   String getName();
}

class KeyA implements Key {
    private String name;
    private int fieldA;
}

class KeyB implements Key {
    private String name;
    private int fieldB;
}

Могу ли я использовать интерфейс Key в качестве ключа в секционированном кэше Coherence?


person Evgeniy Strepetov    schedule 20.09.2017    source источник


Ответы (2)


Да, но вы должны убедиться, что все возможные реализации Key соответствуют следующим предварительным условиям (из Документация Oracle):

Ключи кэша также должны обеспечивать реализацию методов hashCode() и equals(), и эти методы должны возвращать согласованные результаты на узлах кластера. Это означает, что реализация hashCode() и equals() должна основываться исключительно на сериализуемом состоянии объекта (то есть на непереходных полях объекта).

...

Некоторые реализации кэша (в частности, разделенный кэш) используют сериализованную форму ключевых объектов для проверки равенства, что означает, что ключи, для которых метод equals() возвращает значение true, должны быть сериализованы одинаково.

Есть хорошая статья Патрика Перальты, в которой это объясняется. поведение.

person Sergey Khudyakov    schedule 30.09.2017

Здесь в качестве ключа можно использовать экземпляры класса, реализующего этот интерфейс.

person Viktar Charnarutski    schedule 21.09.2017