Генерация исключений InvalidCapacity и InvalidState во время allocateCapacity/deallocateCapacity

Я видел в документации интерфейсов Redhawk Frontend здесь, что вызывает allocateCapacity() и deallocateCapacity() предназначены для создания определенных исключений, если соответствующая операция не удалась. Однако текущая генерация кода в Redhawk 1.9 (и, судя по всему, в текущей разработке) предполагает, что разработчики должны использовать парадигму вызова setAllocator() для свойства распределения с объектом Allocator. Интерфейс распределителя выглядит следующим образом:

public interface Allocator<E> {
    public boolean allocate(E capacity);
    public void deallocate(E capacity);
}

Эти методы не генерируют (проверенные) типы исключений InvalidCapacity и InvalidState. Я ожидал, что смогу выбрасывать их во время моих реализаций allocate() и освобождать для свойства структуры распределения тюнера и позволять им распространяться до вызовов allocateCapacity(), deallocateCapacity(), но отсутствие операторов @throws в интерфейсе Allocator мешает мне это сделать.

Мои вопросы:

  1. Правильно ли я считаю, что разработчики должны использовать подход setAllocator()?
  2. Если да, то есть ли способ генерировать эти проверенные исключения в реализации распределителя, или нам не рекомендуется генерировать их в несгенерированном коде?
    2.a. Если выбрасывать их не рекомендуется, есть ли какой-либо стандартный способ указать на сбой при освобождении?
  3. Если нет, то как мы должны реализовать распределение? Переопределение allocateCapacity() и DeallocateCapacity() непосредственно в классе устройства кажется плохим подходом.

Я разрабатываю Redhawk 1.9.0 на RHEL 5.


person Jack O'Reilly    schedule 17.07.2014    source источник


Ответы (1)


Да, обычно интерфейс Allocator является предпочтительным методом реализации распределения. В большинстве случаев базовый класс Device будет обрабатывать за вас исключения InvalidState и InvalidCapacity. Однако он предполагает универсальные устройства, и в спецификации FRONTEND есть несколько мест, где вы должны генерировать исключение, которое нельзя проверить на уровне базового класса, например, допустим ли идентификатор распределения. К сожалению, поскольку InvalidState и InvalidCapacity являются проверенными методами, сделать это напрямую через интерфейс Allocator невозможно.

Есть два способа обойти это ограничение:

  1. Реализуйте свои собственные функции allocateCapacity() и DeallocateCapacity(), что означает, что вам придется заново реализовать все функциональные возможности базового класса.
  2. Throw unchecked exceptions in your allocate() and deallocate()
    • allocate() turns IllegalArgumentException into CF.Device.InvalidCapacity
    • Deallocate() превращает ArithmeticException и IllegalArgumentException в CF.Device.InvalidCapacity.

До версии 1.9 вам все равно приходилось делать №1, так что это неплохой подход. Проблема с № 2 заключается в том, что это хак, и использование IllegalArgumentException приведет к потере сообщения об исключении.

person Justin Irwin    schedule 21.07.2014
comment
Спасибо, Джастин. Вы не знаете, планируется ли это и для будущих выпусков Redhawk? - person Jack O'Reilly; 21.07.2014