Возврат null при вызове TwinColumn.getValue() без выбранных опций

Добрый день.

Данное поведение заметил при работе с компонентом TwinColumn, но предполагаю, что оно справедливо для всех компонентов, содержащих значения в виде коллекции.
В большинстве случаев, при работе с компонентами, реализующими интерфейс HasValue, при вызове метода getValue() и при отсутствии выбранного значения мы получаем null.
В случае же с TwinColumn null никогда не будет получен, поскольку value в данном случае - пустая коллекция. Таким образом, скажем, валидация заполнения перестает быть единообразной.

Так вот вопрос - может будет лучше возвращать null или валидация заполнения - это частный случай и данное поведение более логично для компонента? И если это частный случай, то может быть стоит добавить в интерфейс метод isEmpty()?

1 симпатия

Здравствуйте,

Да, TwinColumn действительно возвращает экземпляр коллекции даже в случае отсутствия значения. При этом это не частный случай, т.е. такое поведение связано лишь с внутренней реализацией используемого нами компонента.

Сделать валидацию единообразной можно следующим образом:

Collection value = Collections.unmodifiableCollection(((Collection) twinCol.getValue()));
boolean empty = value.isEmpty();

Этот код может быть использован как для TwinColumn, так и для, например, OptionsGroup или OptionsList.

При этом компоненты OptionsGroup и OptionsList могут использоваться как single-value компоненты, поэтому для них не всегда корректным будет наличие метода isEmpty().

Даниил.

Даниил, я имел ввиду несколько другую штуку:
Единообразие в проверке компонентов, реализующих hasValue, скажем в методе вроде:

void someMethod(){
	if(checkFields(subscriberInfoFields)) /*...*/
	if(checkFields(adressInfoFields)) /*...*/
}

boolean checkFields(List<HasValue> someFIelds){
    boolean result = true;
    for(HasValue field:someFIelds) 
        if(field.getValue() == null){
            result = false;
            break;
        }
    return result;
}

isEmpty скорее как пример использовал - имел ввиду проверка компонента, реализующего HasValue на заполнение значения.

В общем то, поэтому изначально и хотел в обсуждения тему засунуть - хотелось бы узнать мнение со стороны, насколько такое расширение было бы уместным.

Я вас понял.

К сожалению, реализовать такое единообразие не получится исходя из того, что некоторые компоненты могут хранить единственное значение, а некоторые - коллекции. Кроме того, некоторые компоненты могут работать как в single-value так и в multiple-values режимах.

А когда компонент может работать с коллекцией, возвращать null в случае, если не выбрано ни одного значения - это моветон.

Предложенный вами вариант очень похож на встроенную валидацию UI компонентов с использованием некоторого универсального валидатора, учитывающего все возможные возвращаемые компонентом значения.

Совершенно верно - похож, просто иногда требуется более сложная логика проверки, которая, если и может быть реализована стандартным валидатором (в абстрактном примере выше, скажем, можно выставлять флаг required и вызывать метод validateAll(), убирая флаг после вызова), но такое решение не очень прозрачное при чтении и практически сразу видны камни в его реализации.

В любом случае спасибо, я Вас услышал.