Я смотрел на класс Guava Optional и its justification, и я задавался вопросом, будет ли полезен подобный класс с ошибкой при представлении значений, которые не должны быть нулевыми. Я не могу найти никакого обсуждения этой идеи, поэтому я подумал, что попрошу здесь.Будет ли обязательным <T> быть полезным дополнением наряду с дополнительным Guava <T>?
Моя первая попытка попытается остаться в стиле, используемом Guava, a Mandatory<T>
, подвергая статический завод of(T t)
. Этот метод выдает NullPointerException
, если вызывается с нулевым аргументом.
Мой особый интерес заключается в пригвождении семантики методов интерфейса в отношении нулевой обработки. Я думаю, что принятие нулевых аргументов или нет - это конструктивное решение, которое должно быть специфицировано в интерфейсе, чтобы клиентский код мог быть спроектирован соответствующим образом и может избежать дублирования логики проверки предварительных условий. Таким образом, интерфейс, используя этот класс может иметь такие методы, как
fire(Mandatory<Employee> employee);
и клиент может позвонить
fire(Mandatory.of(unfortunateEmployee));
Я подозреваю, что обязательно тип будет довольно легко найти с помощью аспектов и например, для проверки дальнейших проверок перед вызовом, если было абсолютно необходимо, чтобы такие отмеченные аргументы метода не были равны нулю.
Я также рассмотрел подходы, основанные на аннотациях, такие как fire(@NotNull Employee employee)
, но реализации, которые я видел, требуют дополнительной проводки валидаторов.
Итак, вопросы ... эта идея существует где-то уже? Если нет, я пропустил что-то очевидное, что подрывает его? Или лучше сделать это?
В общем, все параметры метода должны быть обязательными, если только они явно не документированы как разрешенные как null (мы используем аннотацию '@ Nullable' для документирования этого) или если существует перегрузка метода, который просто не принимает параметр (это предпочтительный способ сделать параметр необязательным, на мой взгляд). Мы определенно не выступаем за использование опций «Необязательный» для параметров метода, а «Обязательный » будет иметь те же проблемы, которые необязательны при использовании в качестве типа параметра, только хуже, потому что почти все параметры должны будут его использовать. –
ColinD
Примечание: необязательный вариант теперь включен в Java 8. http://winterbe.com/posts/2014/03/16/java-8-tutorial/ – Barett