2014-01-21 7 views
0

Я смотрел на класс 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), но реализации, которые я видел, требуют дополнительной проводки валидаторов.

Итак, вопросы ... эта идея существует где-то уже? Если нет, я пропустил что-то очевидное, что подрывает его? Или лучше сделать это?

+2

В общем, все параметры метода должны быть обязательными, если только они явно не документированы как разрешенные как null (мы используем аннотацию '@ Nullable' для документирования этого) или если существует перегрузка метода, который просто не принимает параметр (это предпочтительный способ сделать параметр необязательным, на мой взгляд). Мы определенно не выступаем за использование опций «Необязательный » для параметров метода, а «Обязательный » будет иметь те же проблемы, которые необязательны при использовании в качестве типа параметра, только хуже, потому что почти все параметры должны будут его использовать. – ColinD

+0

Примечание: необязательный вариант теперь включен в Java 8. http://winterbe.com/posts/2014/03/16/java-8-tutorial/ – Barett

ответ

6
fire(Mandatory<Employee> employee); 

Если у вас есть метод с этой подписью, еще можно было назвать fire(null); просто было бы, чтобы у вас был null типа Mandatory<Employee> вместо типа Employee. Вы вообще не улучшили безопасность; вы просто добавили избыточный слой обертывания.

Если вы хотите, чтобы этот параметр требовался, рекомендуется использовать, например, Preconditions.checkNotNull как первое, что нужно сделать в методе, чтобы сразу же выбросить NullPointerException, если значение равно null.

1

добавив Mandatory.of метод, который бросает NPE

Использование переменной T уже бросить NullPointerException, так в чем дело?

Как указать, что параметр требуется как часть контракта?

Javadoc был использован для этого в течение длительного времени.

Да, но я хочу обеспечить его соблюдение.

У вас слишком много времени на ваших руках. Это в сторону ...

@NotNull - это «новый способ». Вы можете использовать AOP для автоматической проводки не нулевой проверки для желаемых методов.Вот несколько больших реализаций:

http://blog.solidcraft.eu/2010/09/getting-rid-of-null-parameters-with.html http://janistoolbox.typepad.com/blog/2009/12/aopvalidationnotnull.html

+0

Спасибо за комментарий + править. Счетчики: 1) он не может бросать NPE, зависит от того, что делает код, и никаких гарантий относительно того, куда он будет выброшен. Иногда далеко от места, где проблема должна быть исправлена! 2) Учитывая, что я могу рассказать компилятору, что не должно быть нулевым, почему я намеренно оставляю его для людей, чтобы тратить время, забыть и испортить? 3) валидаторы и библиотеки AOP нуждаются в их реализации, не гарантируют, что они будут внедрены во время выполнения и имеют кривую обучения. Подход, основанный на дополнительном стиле, является простой старой Java и имеет свои ограничения и преимущества. – Brabster