Игнорировать значение свойств (Hashtable) с нулевым значением

У меня есть метод, который принимает параметр java.util.Properties,

Мне нужно указать различные параметры, значение которых может быть нулевым.

Я получаю NullPointerException, потому что Hashtable.put не может получить нулевое значение

java.lang.NullPointerException
        at java.util.Hashtable.put(Hashtable.java:460)
        ...

Я могу исправить это, используя метод проверки нулей:

private void putIfNotNull(Properties p, String name, String value) {
    if (value!= null) {
        p.put(name, value);
    }
}

Или создайте класс-оболочку и используйте его:

public class PropertyHolder extends Properties {
 @Override
    public Object put( Object key, Object value ) {
    if (value != null) {
        return super.put(key, value);           
    }
    return null;
}

и используйте его аналогично Property:

Properties p = new PropertyHolder();

Правильный ли второй вариант? или есть более простое / встроенное решение?

Второй вариант правильный? Нет. Расширение коллекций - это почти всегда плохая идея. И есть несколько других способов добавить значения на карту, которые обойдут вашу проверку. Но самое главное, вы почти никогда не должны игнорировать недопустимый вызов метода и делать вид, что он действителен: установка нулевого значения - это ошибка, о которой следует сигнализировать, выбрасывая NullPointerException, и исправлять.

JB Nizet 01.07.2018 13:21

@JBNizet Но не вся реализация карты выдает исключение NullPointerException, поэтому разрешение отправки нулевых значений не всегда является ошибкой, я просто хочу игнорировать такие значения при использовании Properties

user7294900 01.07.2018 13:26

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

JB Nizet 01.07.2018 13:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
692
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Метод putIfNotNull - лучший вариант, потому что он ясно дает понять, что он не будет помещать значение, если оно равно нулю. Создание подкласса Properties, который молча отклоняет нулевые значения внутри метода put, означает нарушение ожидаемого поведения Maps - если put("key", value) возвращается без генерации исключения, то get ("key") должен вернуть тот же самый value.

Не могли бы вы пояснить, почему / есть ли другой вариант?

user7294900 01.07.2018 13:31

@ user7294900 Классы стандартной библиотеки Java имеют четко определенное поведение. Например, метод Map.put должен либо связать данный ключ с данным значением, либо завершиться ошибкой с исключением. И если Map.put(key, value) успешен, Map.containsKey(key) и Map.containsValue (value) должны вернуть true, а Map.get(key) должен вернуть value. Плохая практика - переопределять эти методы таким образом, чтобы нарушать их указанное поведение, поэтому второй вариант не рекомендуется. И, чтобы ответить на ваш другой вопрос, нет встроенного решения, и первый вариант самый простой.

Leo Aso 01.07.2018 13:40

Другие вопросы по теме