У меня есть этот тип настраиваемого свойства:

public class EmbeddedEntityIterable implements Serializable, ByteIterable {
  
  @NotNull
  @Override
  public ByteIterable subIterable(int offset, int length) {
    return null;
  }

  @Override
  public int compareTo(@NotNull ByteIterable o) {
    return 0;
  }

}

Как Xodus использует subIterable и compareTo? Безопасно ли просто возвращать значение NULL в методе @NotNull? Этот EmbeddedEntityIterable в основном представляет собой скрытый Map<String,Comparable>, который также является представлением очень вложенного объекта JSON.

1
Fireburn 5 Окт 2020 в 12:41

1 ответ

Лучший ответ

Возвращать null небезопасно, и вам нужно реализовать нетривиальный compareTo. В противном случае вы не сможете использовать свой ByteIterable в качестве ключа (для Магазинов любого типа) и значения (для Магазинов, которые могут иметь дубликаты ключей). Если вы используете EntityStores API и ваш ByteIterable в качестве значения свойства, вам определенно необходимо реализовать методы, поскольку ByteIterable будет использоваться в качестве ключа в индексе значения свойства.

Для пользовательских реализаций ByteIterable предпочтительно наследовать от абстрактный класс ByteIterableBase, который имеет базовые реализации методов.

Кроме того, если вы определяете настраиваемый тип свойства, вы должны определить порядок для поддержки нестандартных функций, таких как сортировка, поиск значения или поиск в диапазоне значений. Если вам не нужны эти функции, возможно, имеет смысл сохранять такие данные в BLOB-объектах или строках BLOB-объектов вместо свойств.

1
Vyacheslav Lukianov 8 Окт 2020 в 08:37