Есть ли стандартный способ проверки ограничений между несколькими элементами в массиве? - PullRequest
1 голос
/ 06 марта 2020

Я работаю над загрузочным микросервисом RESTful Spring с конечной точкой POST, которая принимает Order.

. Order содержит, среди других полей, массив Product, который для цель этого примера состоит из двух полей, id и parameter, оба из которых являются String.

Требование, которое я получил, состоит в том, чтобы реализовать проверку массива Product, например, так:

IF товары содержат элемент с идентификатором 123, THEN и не могут содержать элемент с идентификатором [234, 345].

и

IF товары содержат элемент с идентификатором 789, THEN любой продукт с идентификатором в [456, 567] должен иметь поле ненулевого параметра.

Я реализовал их как пользовательские аннотации проверки с двумя методами conditionalOn и required - и затем валидатор для каждой аннотации, который реализует лог c для каждого утверждения: например, для первого,

if (order.getProducts().stream().anyMatch(p -> annotation.conditionalOn().equals(p.getId()))) {
  return order.getProducts().stream().noneMatch(p -> annotation.required().equals(p.getId()));
}

Но поле на Order заканчивается огромным выбором аннотаций, с Оме дублируется, так как есть несколько одинаковых ограничений. В качестве упрощенного примера:

class Order {
  @CombinationsNotAllowed({
    @CombinationNotAllowed(conditionalOn = "123", required = { "234", "345" }),
    @CombinationNotAllowed(conditionalOn = "321", required = { "432", "543" })
    // ... etc etc
  })
  ParametersRequired({
    @ParameterRequired(conditionalOn = "789", required = { "456", "567" }),
    @ParameterRequired(conditionalOn = "987", required = { "654", "765" })
    // ... etc etc
  })
  // further annotations
  private List<Product> products;
}

Я также осознаю, что эти ограничения могут измениться, хотя я не ожидаю их.

Есть ли еще стандартный способ определения этих ограничений для элементов в Order#getProducts?

1 Ответ

0 голосов
/ 06 марта 2020

Использование композиции для переноса HashSet (или HashMap) и реализации Iterable (или Collection). В ваших add() и addAll() методах проверьте свои ограничения. Поскольку в HashTables есть поиск O (1), он будет достаточно производительным.

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

Затем вы можете сделать аннотацию, которая проверит необходимые элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...