powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / null и пустая строка
33 сообщений из 33, показаны все 2 страниц
null и пустая строка
    #38294347
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задумался об аналогиях. В некоторых DBMS на уровне типов
данных не различается состояние пустой строки и строки равной NULL.
На уровне операций. Т.е. конкатенации и поиски строк и прочие
операции ведут себя идентично. А в Java коде мы ставим много
проверок на аргумент == null. Задумался о враппере для
строк где эта особенность учитывается.
...
Рейтинг: 0 / 0
null и пустая строка
    #38294386
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно, конечно, посткомпиляцией обернуть все небезопасные обращения к переменным типа String.
Но NPE на строках, по-моему не такая уже большая проблема.
...
Рейтинг: 0 / 0
null и пустая строка
    #38294392
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczобернуть все небезопасные обращения к переменным типа String.

Вот это реально проблема. Лопатить весь код. Мне кажется лучше
создать новый тип данных. Что-то вроде SafeString или NullableString.
Не наследник. Не контейнер а просто вообще новый тип. И заимплементить
потихоньку эту Varchar-like логику.
...
Рейтинг: 0 / 0
null и пустая строка
    #38294398
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если не секрет, в каких именно dbms?
...
Рейтинг: 0 / 0
null и пустая строка
    #38294402
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВот это реально проблема. Лопатить весь код.

про "посткомпиляцию" ты зачем-то ловко из моего коментария выкинул. Конечно же не руками делать.
...
Рейтинг: 0 / 0
null и пустая строка
    #38294412
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraЕсли не секрет, в каких именно dbms?
В Oracle.
...
Рейтинг: 0 / 0
null и пустая строка
    #38294438
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗадумался о враппере для строк где эта особенность учитывается. Враппер - избыточно. Здесь достаточно одной функции, например: StringUtils.defaultString .
...
Рейтинг: 0 / 0
null и пустая строка
    #38294443
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonivanraЕсли не секрет, в каких именно dbms?В Oracle.
конкатенация - да, а про поиски строк неверное утверждение, я поэтому и спросил. Ни разу не встречал чтобы выдавался один и тот же результат на условия
Код: sql
1.
2.
where somestring=''
where somestring is null


Насчет явы - а почему бы не использовать StringBuilder? Там конструктор с null и пустой строкой дают одинаковое содержимое
...
Рейтинг: 0 / 0
null и пустая строка
    #38294459
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonне различается состояние пустой строки и строки равной NULL Формально они идентичны. Иногда это используется на практике: Validating Null and Empty Strings
...
Рейтинг: 0 / 0
null и пустая строка
    #38294465
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczmaytonВот это реально проблема. Лопатить весь код.

про "посткомпиляцию" ты зачем-то ловко из моего коментария выкинул. Конечно же не руками делать.
Извини. Что-то в это время я торможу как слоупок. Да и не спец я в посткомпилляциях.
Может кинешь ссылку на юзкейс?
...
Рейтинг: 0 / 0
null и пустая строка
    #38294594
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ некоторых DBMS на уровне типов
данных не различается состояние пустой строки и строки равной NULL.
На уровне операций. Т.е. конкатенации и поиски строк и прочие
операции ведут себя идентичночто гармонично уравновешивается троичной логикой и необходимостью отдельно обрабатывать "null" и "все остальные данные".

P.S. А разве простое someConstant.equals(someVar) не закрывает значимую/существенную часть NPE-причин в случае строк?
...
Рейтинг: 0 / 0
null и пустая строка
    #38294907
J.Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanИногда это используется на практике: Validating Null and Empty Strings

Красивый код из примера по ссылке:
Код: java
1.
2.
3.
4.
5.
if (testString.equals(null)) {
  doSomething();
} else  {
  doAnotherThing();
}
...
Рейтинг: 0 / 0
null и пустая строка
    #38294912
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J.SergeКрасивый код из примера по ссылке:
Код: java
1.
2.
3.
4.
5.
if (testString.equals(null)) {
  doSomething();
} else  {
  doAnotherThing();
}


Даа... фак мой мозг от JSF.
...
Рейтинг: 0 / 0
null и пустая строка
    #38295034
J.Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не, меня умиляет описание этого кода:
авторBy default, the doAnotherThing method is called even when the user enters no data, because the testString element has been initialized with the value of an empty string.

Можно подумать, если testString проинициализировать null'ом, то вызовется doSomething...
...
Рейтинг: 0 / 0
null и пустая строка
    #38295063
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я полез в дебри. В нашем продакшен коде очень много паттернов типа

Код: java
1.
2.
3.
if (someObject!=null) && (someObject.subObject!=null) && (someObject.subObject.Property.equals(someFuckenValue) && .... ){
    .....
}



И строки это просто частный случай. Много операций использующих логику проверок и сравнения с null.

Кружусь в медленном вальсе. Медитирую. Пью кофе и грызу конфетки.
...
Рейтинг: 0 / 0
null и пустая строка
    #38295089
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StringUtils на все случаи жизни. Либо defaultString для сравнений, либо isBlank/isNotBlank для условий. зачем усложнять?
Готовый код не надо перелопачивать, просто далее используй только новый, и корректируй старый по мере попадания на глаза.
...
Рейтинг: 0 / 0
null и пустая строка
    #38295096
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Код: java
1.
2.
3.
if (someObject!=null) && (someObject.subObject!=null) && (someObject.subObject.Property.equals(someFuckenValue) && .... ){
    .....
}



Инкапсуляция ни к черту. Это и есть та самая Anemic Model на которую так плюётся Фаулер. Почему всё это не находится внутри объектов someObject и subObject? Почему текущему классы приходится обращаться к Property ещё через две ссылки?
Некий внешний класс проводит манипуляции\проверки состояния каких-то объектов, вместо того чтобы делигировать им эту логику.
...
Рейтинг: 0 / 0
null и пустая строка
    #38295106
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
так работает мозг, сначала проверка someObject!=null, потом вспоминает что еще можно проверить, и руки сами дописывают остальное
...
Рейтинг: 0 / 0
null и пустая строка
    #38295111
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapeckerBlazkowicz,
так работает мозг, сначала проверка someObject!=null, потом вспоминает что еще можно проверить, и руки сами дописывают остальное
Я бы не называл это "работает мозг". Это называется что вижу, то пою. NPE? Та, пофиг. Не будем фиксить первопричину. Просто добавим проверку на null.
...
Рейтинг: 0 / 0
null и пустая строка
    #38295113
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ полез в дебри. В нашем продакшен коде очень много паттернов типа

Код: java
1.
2.
3.
if (someObject!=null) && (someObject.subObject!=null) && (someObject.subObject.Property.equals(someFuckenValue) && .... ){
    .....
}



И строки это просто частный случай. Много операций использующих логику проверок и сравнения с null.

Кружусь в медленном вальсе. Медитирую. Пью кофе и грызу конфетки.
Поэтому я написал выше что строки это очень частный случай. Проблемы null значений он не решит.
Я стараюсь минимизировать проверки на null и, если возникает NPE, фиксить его в одном месте там где появляется null значение. А не во всех местах куда оно распространяется в итоге.
А так, рекомендации стандартные
NullObject pattern
@NotNull (Oval, IntelliJ IDEA и многие другие)
Языки с интегрированым NotNull, например Kotlin.
...
Рейтинг: 0 / 0
null и пустая строка
    #38295114
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗадумался об аналогиях. В некоторых DBMS на уровне типов
данных не различается состояние пустой строки и строки равной NULL.
На уровне операций. Т.е. конкатенации и поиски строк и прочие
операции ведут себя идентично. А в Java коде мы ставим много
проверок на аргумент == null. Задумался о враппере для
строк где эта особенность учитывается.

Зачем? В java на клиенте во-первых, совсем другие правила для работы с NULL, чем в базе данных, во-вторых java null - это совсем другой null, нежели NULL в базе данных и SQL. Они никак не связаны друг с другом.
...
Рейтинг: 0 / 0
null и пустая строка
    #38295124
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczИнкапсуляция ни к черту. Это и есть та самая Anemic Model на которую так плюётся Фаулер. Почему всё это не находится внутри объектов someObject и subObject? Почему текущему классы приходится обращаться к Property ещё через две ссылки?
Некий внешний класс проводит манипуляции\проверки состояния каких-то объектов, вместо того чтобы делигировать им эту логику.
Я унаследовал этот код от предшественников. И задача вобщем-то не стоит как "Почему-бы не".
Просто нет времени и возможности рефакторить фундамент. А начать сначала
с каких-то разумных упрощений по мере возможности - это да.

А появление null-аргументов String растёт корнями из ORM, DAO и прочих слоёв которые
сопрягаются с БД. Что поделаешь. NULL для БД - это нормально.
...
Рейтинг: 0 / 0
null и пустая строка
    #38295137
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ унаследовал этот код от предшественников. И задача вобщем-то не стоит как "Почему-бы не".

А как тогда задача стоит?

maytonПросто нет времени и возможности рефакторить фундамент. А начать сначала
с каких-то разумных упрощений по мере возможности - это да.

Не нужно рефакторить. Выкидываем проверку на null, где она не нужна. Добавляем NotNull для выявления источника null значения.
Исправляем на NullObject либо выкидываем Exception\делаем валидацию на месте появляения null, а не на месте использования.

maytonА появление null-аргументов String растёт корнями из ORM, DAO и прочих слоёв которые
сопрягаются с БД. Что поделаешь. NULL для БД - это нормально.
Нет, это не нормально. Во-первых NULL поля в базе тоже стоит свести к минимуму и оставить только там где они действительно нужны.
Во-вторых проверки на null значения свойств сущностей зачастую легко инкапсулируются в самих сущностях, и тогда весь остальной код можно от них избавить. Без конкретного примера понять не просто. Покажи реальный похожий код из системы и объясни источник null значений. Тогда можно обсудить как выкинуть лишние проверки.
...
Рейтинг: 0 / 0
null и пустая строка
    #38295162
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНе нужно рефакторить. Выкидываем проверку на null, где она не нужна. Добавляем NotNull для выявления источника null значения.
Исправляем на NullObject либо выкидываем Exception\делаем валидацию на месте появляения null, а не на месте использования.
Я место появления знаю. 99% это объекты DAO. Переходники MyBatis.
...
Рейтинг: 0 / 0
null и пустая строка
    #38295171
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ место появления знаю. 99% это объекты DAO. Переходники MyBatis.
Замечательно. Тогда просто нужно отказываться от абсолютно анемичных сущностей и выносить эти провери туда. Код станет намного проще.
...
Рейтинг: 0 / 0
null и пустая строка
    #38295188
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczmaytonЯ место появления знаю. 99% это объекты DAO. Переходники MyBatis.
Замечательно. Тогда просто нужно отказываться от абсолютно анемичных сущностей и выносить эти провери туда. Код станет намного проще.

Я правильно понимаю что вы имеете ввиду делать вместо

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
class SomeObjectDAO {
    ...
    public void save(SomeObject someObject) {
        if (someObject == null) { throw new IllegalArgumentException(...); }

        ...
    }
}



делать


Код: java
1.
2.
3.
4.
5.
6.
class SomeObjectDAO {
    ...
    public void save(SomeObject someObject) {
        ...
    }
}



?
...
Рейтинг: 0 / 0
null и пустая строка
    #38295195
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scymaks,

Отчасти. В данном случае DAO является пользователем значения, а не источником. К анемике это имеет мало отношения. Здесь мы просто валидируем входной аргумент, сродни assert-ам, патаясь сделать защиту от нерадивых коллег. Но по хорошему, да. В указаном месте бороться с null значнием уже поздно. По хорошему, ведь, нужно исправить код, который передаёт методу save null значение.
...
Рейтинг: 0 / 0
null и пустая строка
    #38295368
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonivanraЕсли не секрет, в каких именно dbms?
В Oracle.

Да не только он, на самом деле.
...
Рейтинг: 0 / 0
null и пустая строка
    #38295742
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
если следовать вашей логике - решать проблему в корне.
То - строка - не сущность. И нулём \ объектом быть не может. Это простой тип.
И тогда весь код упрощается.
Кстати, это верно, как раз таки на клиенте в Java (по смыслу).
В БД Null означает не введи данные в ячейку памяти.
...
Рейтинг: 0 / 0
null и пустая строка
    #38316245
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу NULL и Varchar (String) в БД Oracle.

Прошу прощения за внезапный Ап.

http://habrahabr.ru/post/127327/ NULL и пустая строка

Здесь Oracle отходит от стандарта ANSI SQL и провозглашает эквивалентность NULLа и пустой строки. Это, пожалуй, одна из наиболее спорных фич, которая время от времени рождает многостраничные обсуждения с переходом на личности, поливанием друг друга фекалиями и прочими непременными атрибутами жёстких споров. Судя по документации, Oracle и сам бы не прочь изменить эту ситуацию (там сказано, что хоть сейчас пустая строка и обрабатывается как NULL, в будущих релизах это может измениться), но на сегодняшний день под эту СУБД написано такое колоссальное количество кода, что взять и поменять поведение системы вряд ли реально. Тем более, говорить об этом они начали как минимум с седьмой версии СУБД (1992-1996 годы), а сейчас уже двенадцатая на подходе.

NULL и пустая строка эквивалентны:

exec test_bool( '' is null ); -- TRUE
...
Рейтинг: 0 / 0
null и пустая строка
    #38316292
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
им конечно виднее, но не понятно почему нельзя ввести новое поведение, а старое подвесить на ключик в конфигурации. ну или наоборот, поскольку куча народу 100% проигнорирует релизные ноуты.

в постгресе так.
...
Рейтинг: 0 / 0
null и пустая строка
    #38316346
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ввести-то можно, но, во-первых баги, а во-вторых мало кто готов искать сколько работающего кода отвалится.
...
Рейтинг: 0 / 0
null и пустая строка
    #38316547
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне вообще троичная а точнее не троичная а логика true-false-null нравится. Очень многие
проверки уходят. Если ввести некое мета-выражение типа ifnull-elsenull-endifnull то
фрагмент кода который я привел выше упрощается и остаётся самое правое выражение
несущее суть а все проверки на NULL уходят в дефолт по линии FALSE.

Дело за малым. Формализовать логику или просто позаимствовать логику условий JOINS
которая уже есть в DBMS Oracle.
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / null и пустая строка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]