|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Ну есть класс проверок которые компилятор видит. Это "восклицательный знак" возле декларации типа в шарпах о котором так эмоционально говорил микрон. Но что делать с динамикой? Что делать с кодом который появится только в рантайме? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 22:10 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, В C, NULL это просто.... 0 (НОЛЬ!). Стандартное значение для непроинициализированного указателя. нет. Стандартное значение для непроинициализированного указателя, рандомный мусор. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 02:50 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevЯ имел в виду "новые" из пакета java.time, а не "старые" из java.lang.Object ))) Т.к. в старых ни тайм зон, ни нормальной арифметики. В Joda Time - два комплекта классов. Иммутабельная + мутабельная версии на самом деле, в принципе, я в результате почти всю арифметику на long в миллисикундах перевел . Честно говоря, сейчас даже не очень вспомню, зачем мне Joda Time в вычислениях был нужен... но зачем-то использовалБгг, не удивительно. До java.time.* в жаве единственный нормальный способ работы со временем был java.util.Calendar, при этом java.util.Date вообще какое-то недоразумение - внутри у нее часовой пояс есть, а API для его смены нет, т.е. если вы пытались сделать какую-то нетривиальную арифметику на java.util.Date, то остается только посочувствовать. Что произошло после появления java.time.*? Да ничего нормального не произошло, а именно: - все преобразования все равно нужно через long (java.time.Instant) делать - еще нужно за смежными модулями следить (ну вот не умеет старый оракловый jdbc-драйвер биндить новые типы правильно, т.е. его нужно или обновлять, что не всегда возможно, или говнокодить) Вообщем приобретение Sun Ораклом таки сказывается, при этом негативно: движение есть - результата нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 07:34 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonНо что делать с динамикой? Что делать с кодом который появится только в рантайме? Не пойму. Это ведь логика программы. Это задача программиста. Значит код пошел не предсказуемым образом как ПЛАНИРОВАЛ программист. От этого нет защиты как от деления на ноль. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 07:36 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Petro123maytonНо что делать с динамикой? Что делать с кодом который появится только в рантайме? Не пойму. Это ведь логика программы. Это задача программиста. Значит код пошел не предсказуемым образом как ПЛАНИРОВАЛ программист. От этого нет защиты как от деления на ноль. В коде всегда есть интерфейсы которые реализовывал кто-то другой. В использовании мы обычно оптимисты. Мы , когда прототипируем , всегда полагаем что string это строка и Никаких других состояний быть не может. Мы считали что контракт сильный. И мы - не параноики чтобы каждый раз ставить проверки условия кажущуюся очевидность. Мы - в меру ленивы. Что даёт optional? Молчаливое напоминание. Напоминание а том что есть варианты. Варианты волучения нашего string. get с генерацией нового класса исключений. getOrElse где мы обязаны указать альтернативу. orElseGet с указанием функции разрешения опционала. orElseThrow с указанием функции генерации нашего типа исключения в зависимости от ситуации. Разумеется я не тешу себя иллюзиями по поводу того что программист правильно выберет нужный метод вскрытия коробочки. Но протокол получает определенные критерии строгости. Обычное разыменование (string)nulll уже не работает. Работает коробочка. Самый первый метод требует предварительной проверки isPresent. По крайней мере среда разработки это видит. Кстати sonarqube и findbug обладают слепотой относительно анализа использования интерфейса реализация которого неизвестна в фазе компиляции. Они также считают что поставщик всегда вернет что то непустое. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 08:17 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Диезmikronпропущено... покажи: где детская болезнь? 1. Null нельзя использовать в цепочке вычислений, получим NPE в случае отсутствия значения. Первый аргумент уже опровергнут примером. Займёмся вторым. Диез2. null совместим по типу с любым reference-типом по определению, и проверка на null полностью лежит на программисте. С другой стороны String и Optional<String> - это два разных, несовместимых типа, поэтому потребуется явное приведение между ними (просто не получится "забыть" проверить на отсутствие значения) Помоему логично - если обьекта нет то о типе обьекта не может быть речи. Глупо рассуждать о типе теста в дырке от бублика. Но это обстрактно. Покажи на примере что ты имееш в виду. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 10:08 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
BlazkowiczДетский сад, вторая четверть. Ваша истерика нам очень важна. Пишите ещё. Мы тут аргументами и логикой занимаемся а не моралью. Проповеди - мешают. проходи мимо, если нечего сказать по делу. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 10:18 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mayton Код: java 1.
Чистый PR. Звучит красиво: "мы нашли 1М$ ошибку" или "мы исправили1М$ ошибку". Хочется каждому дать премию и повесить на доску почёта. maytonА теперь цифры. Как вы думаете? Какой % потенциальных NPE мы закроем если будем внедрять Options в наши новые бизнес сущности такие как скажем Dao, Repositary, Entity/DTO/Pojo. Мне кажется.... 80%. Почему 80? Не знаю взял 4 к 1. Нравится мне эта пропорция. Но если вы не согласны - я готов заслушать вашу оценку. Реально - 0. Люди как совершали ошибки так и будут их совершать. Компилятор (машина) в данном случае им нечем помочь не может. Оптинал сам - обьект и подвержен тем-же опасностям. Я так думаю: если бы Оптионал был всегда, с самого первого дня, то можно было бы отверждать и требовать что любое возврашаемое значение из функции обязателно сушествует. Это позволило бы избежать ненужных проверок в вызываюшем коде если метод возврашает тип а не оптионал<тип>. Другими словами можно было бы утверждать Код: java 1. 2. 3. 4. 5.
Метод getName всегда возврашает значение. И проверок на наличие значения в вызываюшем коде не делать. Метод getNickname имеет оптионалное значение. Проверки нужны. И компилятор мог бы это проверять. Другими словами плюс Optinal был бы втом что есть "не оптионал". Но сейчас есть куча кода кототрый уже никто не будет переписывать. Есть куча методов которые возврашают null. Следовательно нельзя обеспечить соблюдение первого утверждения. И таким образом сейча плюса - нет. А вот минусы в потреблении пямяти и циклов процессора есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 11:02 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikronЧистый PR. Звучит красиво: "мы нашли 1М$ ошибку" или "мы исправили1М$ ошибку". Хочется каждому дать премию и повесить на доску почёта. Боже, какой бред. То есть ты даже не потрудился почитать статью? Какой, в дырку от бублика, пиар. Речь о том что если бы в null reference изначально распознали бы вселенское зло ещё в далёком 1965 году, то это могло бы съэкономить массу времени в современной разработке. https://en.wikipedia.org/wiki/Tony_Hoare Это даже к Java отношения не имеет. Зачем так кичиться своим невежеством мне не совсем понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 11:29 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonВ коде всегда есть интерфейсы которые реализовывал кто-то другой. В использовании мы обычно оптимисты. Мы , когда прототипируем , всегда полагаем что string это строка и Никаких других состояний быть не может. Мы считали что контракт сильный. И мы - не параноики чтобы каждый раз ставить проверки условия кажущуюся очевидность. Мы - в меру ленивы. Почему мы полагаем, что String это строка? Только потому, что разработчики Java заявили, что ponter'ов у них нет, а на самом деле, Object / String это тот же поинтер только "вид сбоку" С атомарными типами, у нас же такой проблемы нет. Хотя, и в атомарных типах может быть null ))) например Double.NaN, чем не аналог null'а ? maytonЧто даёт optional? Молчаливое напоминание. Напоминание а том что есть варианты. Варианты волучения нашего string. Это какой-то язык для дебилов получается. Сделайте программу которой сможет пользоваться даже идиот и только идиот будет пользоваться вашей программой ( C ) Вот я ожидаю, что по контракту метод getInn() вернет строку ровно в 10 символов и только цифры. И так как я в этом уверен, то потом к этим символам буду обращаться напрямую по индексу и ожидать только символы 0..9. И Optional мне никак не поможет защититься от строки в 9 символов, т.е. я все равно получу null pointer exception (или array out of bound) только парой строчек ниже. Или строгая типизация во всем или это какая-то "обосрались на 20%" ((( maytonget с генерацией нового класса исключений. getOrElse где мы обязаны указать альтернативу. orElseGet с указанием функции разрешения опционала. orElseThrow с указанием функции генерации нашего типа исключения в зависимости от ситуации. Чем это отличается от обычного и стандартного if ? Т.е. мы предполагаем, что дебил-программист написать стандартный if - поленится, а написать orElseGet не поленится? Проблема же не в том, что человеку жаль написать if. Проблема в том, что СОВРЕМЕННЫЕ средства (раньше такая проблема была значительно сглажена), приводят к огромным цепочкам через ".". Например какой нибудь Hibernate. String streetName = getBillById( billId ).getCustomer().getAddress().getStreet().getShorName(); Совершенно осмысленная конструкция, вероятность которой в современных программах крайне высока. И обычный "нормальный" программист готов добавить проверку streetName на null, но делить ВСЮ цепочку вызовов на кусочки и проверять каждый шаг - явно не готов. Почему я говорю, СОВРЕМЕННЫЕ средства. Раньше, когда все классы создавали "ручками", проблема была значительно менее острая. 1) Не было такой глубины вложенности классов. Нормальный человек, в этом случае, просто бы поля адреса кустомера прямо бы в Bill и "вхерачил". Т.к. "ручками" создавать такую клюкву классов, ему было бы лениво 2) В данной конструкции и структуре классов совершенно явно нарушен принцип инкапсуляции. (ну не считать же get/set методы за инкапсуляцию?). А теперь перепишите вышеприведенную строчку на Optional )))) - это же совершенно ничитабельная помойка получится ((( Я вот с ходу даже переписать не могу ((( т.ч. не понимаю, что в getOrElse() указывать нужно ((( 95% NPE с которыми сталкивались в Oracle CC&B 1. Длинные простыни через "." при обращение к полям базы через Hibernate. Какое-то поле в БД не заполнено, получили NPE 2. Аналогичные простыни при работе с DOM XML. Какую-то ноду или элемент в XML пропустили, получили NPE При этом, проверка на null НА ВХОДЕ функции и НА ВЫХОДЕ ф-ции - обычно присудствует. Но делать проверку по всем простыням "." - это действительно умопомрочительно. IMHO Вот реально, банальный оператор a->b являющийся синонимом конструкции ( a!=null ) ? a.b : null в 95 % случаев, был бы совершенно достаточен и реализовать легко. IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 11:33 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Интересно что в c/c++ раньше различали null pointer и wild pointer. Как бы два состояния. Щас наверное зависит от компиллятора. В kotlin есть какой то сахар по усилению проверок на использование null. Вечером посмотрю. Ну... В scala тоже что то было. Вобщем если рассматривать java не как яп. А как платформу с семейством языков то защита от NPE имеется. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 11:38 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikronДиез2. null совместим по типу с любым reference-типом по определению, и проверка на null полностью лежит на программисте. С другой стороны String и Optional<String> - это два разных, несовместимых типа, поэтому потребуется явное приведение между ними (просто не получится "забыть" проверить на отсутствие значения) Помоему логично - если обьекта нет то о типе обьекта не может быть речи. Глупо рассуждать о типе теста в дырке от бублика. Но это обстрактно. Покажи на примере что ты имееш в виду. Нет, не логично. Тип типом, значение значением. 1) В СУБД, практически у любого типа может быть значение NULL. Но (в большинстве случаев) информация про тип при этом сохраняется и все операции допустимые для данного типа - остаются валидны. Попытка выполнить операции над объектом со значением null - какой-то результат, правда не всегда очевидный, 2) В Java, null это указатель в пустоту. Объекта нет. Никакие операции над объектов не допустимы ((( В Java попытка выполнить операцию над объектом со значением null - Null Pointer Exception. Вот смотрю доку на Optional, и вижу, что он обеспечивает гарантию выполнения только одной операции - equals(....). Как-то совсем ни о чем ((( Все же другие операции над объектом, как нужно было обрамлять if, так и нужно будет и с Optional. (синтаксис изменился, но суть то осталась та же. Тот же if который нужно кодировать руками) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 11:45 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonИнтересно что в c/c++ раньше различали null pointer и wild pointer. Как бы два состояния. Щас наверное зависит от компиллятора. Да никак. wild pointer - вещь мне кажется встречающаяся не часто static (глобальные переменные) и члены класса - всегда по умолчанию инициализируются null'ом. Или в момент старта программы (сегмент данных просто инициализируется нулем) или в дефолтном конструкторе Pointer'ы в структурах WinAPI - общепризнанный способ из MS документации, изначально заполнять структуру нулями memset'ом. остаются только локальные переменные ф-ции - но их обычно не много, они долго не живут, программист за ними сам следит IMHO & AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 12:01 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, Боюсь, что задачи обработки null в бд и в яп совершенно разные. Там кортежи и null полноценная операция. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 13:01 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsevmikronпропущено... Помоему логично - если обьекта нет то о типе обьекта не может быть речи. Глупо рассуждать о типе теста в дырке от бублика. Но это обстрактно. Покажи на примере что ты имееш в виду. Нет, не логично. Тип типом, значение значением. Интересно однако. Вот тут какой тип у переменной cc? И какое значение? Код: java 1.
А вот тут? Код: java 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 13:56 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikron, Во всех случаях jvm будет видеть objectref. Коллекция объектов внутри будет представлена более сложным образом. Зависит от имплементации. Но сами объекты также будут представлены такими же ссылками. Впрочем.. Это я нагнетаю. Для старта дискуссии. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 14:32 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevПочему мы полагаем, что String это строка? Только потому, что разработчики Java заявили, что ponter'ов у них нет, а на самом деле, Object / String это тот же поинтер только "вид сбоку" С атомарными типами, у нас же такой проблемы нет. Хотя, и в атомарных типах может быть null ))) например Double.NaN, чем не аналог null'а ? Да. String стоит особняком среди других типов. Хотя-бы потому что ему нет соответствия среди примитивов. Double.NaN - это редкое исключение из правил. Это специальная константа которая обозначает остутствие числа внутри примитива. Но к сожалению мы не сможем применить это например к целым числам byte/short/int/long. Сюда-же специальный символ который зарезервирован в С/С++. Хотя аналогия интересная. Согласен. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 22:19 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Андрей ПанфиловБгг, не удивительно. До java.time.* в жаве единственный нормальный способ работы со временем был java.util.Calendar, при этом java.util.Date вообще какое-то недоразумение - внутри у нее часовой пояс есть, а API для его смены нет, т.е. если вы пытались сделать какую-то нетривиальную арифметику на java.util.Date, то остается только посочувствовать. Что произошло после появления java.time.*? Да ничего нормального не произошло, а именно: - все преобразования все равно нужно через long (java.time.Instant) делать - еще нужно за смежными модулями следить (ну вот не умеет старый оракловый jdbc-драйвер биндить новые типы правильно, т.е. его нужно или обновлять, что не всегда возможно, или говнокодить) Беда в том что java.util.Date создалал инженеришко Джеймс Гослинг. А он закрывал мелкие задачи связанные с кофеваркми и тостерами. Не ставил он себе глобальных задач. Не думал об иммутабельности. О глобализации. Ему - важно чтоб байт-код летал на жлобских процессорах, микроконтроллерах и даже внутри кредитной карты. В Йоде-тайм конечно всё обдумали и причесали. Но ме еще десятилетия будем выкорчёвывать из кода всякие там календари, даты, и не дай бох еще java.util.Vector. А ребята которые озабочены перформансом - вообще считают время внутри long в милисекундах. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 23:10 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevЭто какой-то язык для дебилов получается. Сделайте программу которой сможет пользоваться даже идиот и только идиот будет пользоваться вашей программой ( C ) Вот я ожидаю, что по контракту метод getInn() вернет строку ровно в 10 символов и только цифры. И так как я в этом уверен, то потом к этим символам буду обращаться напрямую по индексу и ожидать только символы 0..9. И Optional мне никак не поможет защититься от строки в 9 символов, т.е. я все равно получу null pointer exception (или array out of bound) только парой строчек ниже. Я для себя как-то определял семейство функций типа substr(), indexof(), e.t.c, толерантных к ошибкам. Их любая реакция на переполнения индекса была безопасной. Тоесть если вы хотите взять substr() позади диапазона исходной строки - то ошибки не будет. Будет просто пуская строка. Ну и null никогда не возвращается. Ну и я там везде логгеров понапихал. С уровнем trace. Надо подсмотреть - включил трейс. На безрыбье - и рак - рыба. Впрочем Optional - это тоже та самая рыба. Контролирует рантайм. А всякие забавные случаи статических анализов о которых так горячо говорил микрон и так среда подсвечивает и Сонар-Куб. Вобщем-то нечего там искать. Хотя как сахар - да. Я согласен что сахар иногда не помешал-бы. По поводу дебилов и всего прочего. Я положа руку на сердце тоже иногда внедряю NPE. Я очень люблю прототипирование и макеты. По любому поводу создаю. И не в модульных тестах а именно в приложениях. main() - и погнал. Разумеется в гонке за прототипом я не всегда ставлю проверки. Это уж как бох даст. Вот сейчас надо померять (оценить объем предполагаемого Lucene-индекса для логов торговых сообщений). Цена вопроса - на сколько порядков больше или меньше заказывать новые виртуалки. Меня спрашивают - а сколько надо диска? Сколько мемори? Сколько будет среднее время отклика? А я - что? Прототипирую. Смотрю. Ну сил коненчо не хватает везде if понаставить. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 23:31 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev95% NPE с которыми сталкивались в Oracle CC&B 1. Длинные простыни через "." при обращение к полям базы через Hibernate. Какое-то поле в БД не заполнено, получили NPE 2. Аналогичные простыни при работе с DOM XML. Какую-то ноду или элемент в XML пропустили, получили NPE При этом, проверка на null НА ВХОДЕ функции и НА ВЫХОДЕ ф-ции - обычно присудствует. Но делать проверку по всем простыням "." - это действительно умопомрочительно. Знакомая ситуация. Многоэтажные этажерки мне тоже приходилось писать. Я вот недавно почитал про Котлин. Если не панацея - то вполне себе решение подобных вопросов. Safe Calls. Elvis Operator. https://kotlinlang.org/docs/reference/null-safety.html ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 23:45 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikronНо сейчас есть куча кода кототрый уже никто не будет переписывать. Есть куча методов которые возврашают null. Следовательно нельзя обеспечить соблюдение первого утверждения. И таким образом сейча плюса - нет. А вот минусы в потреблении пямяти и циклов процессора есть. Есть у меня приложение на котором гоняю бенчмарки. Текстовый CSV-файл на 5 млн строк. База MaxMind. Привязка IP-диапазонов к гео-сущностям. Города. Страны. Для него я созда сущность GeoEntity (без Options). Потом то-же самое с Options. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
В двух экспериментах я загружал CSV-файл с использованием Apache Commons CSV и ложил его в Lucene. За 120 секунд на моём ноутбуке этот файл загружался в БД и индексировался. Никакой разницы с Optional и без Optional я не обнаружил. Она вобщем-то была в рамках стат-погрешности. 1-2 секунды. Это время можно не учитывать. Это по сути случайный шум. Чисто технически имели место 5 млн * 9 полей = 45 млн. полей аллоцировано в хипе и освобождено GC. Размер исходного файла - 450 мб. Размер индекса Lucene - 300 мб. Для себя пока делаю вывод что Optional не влияет на производительность. Если кто-то скажет что влияет - welcome. Прошу бенчмарки. С описанием что и как. Задача разумеется должна быть осмысленной. Тоесть мерять надо полезную задачу + Optional а не сферический Optional в вакууме. Квантовые эффекты нам не нужны. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2018, 00:01 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonЕсли не панацея - то вполне себе решение подобных вопросов. Safe Calls. Elvis Operator. https://kotlinlang.org/docs/reference/null-safety.html +1 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2018, 07:49 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonЗадача разумеется должна быть осмысленной. Тоесть мерять надо полезную задачу + Optional а не сферический Optional в вакууме. Диалог в рюмочной: - А скажите, сколько стоит капля Водки? - Ничего не стоит. - Хорошо, накапайте мне пожалуста рюмочку. Это я к чему: На фоне других операций не заметно, но когда зараза расползётся обшая производителность просядет. Только никто не заметит. это как дурной стиль программирования: в отделной операции не заметно, но если пременять глобално то эфект огромный. Скажем на отделном месте из 40 тактов 4 безполезных. значит применяя повсеместнио 10% производителности - просто горячий воздух и вклад к глобальному потеплению. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2018, 12:40 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikron, Надо решать проблемы по мере их поступления. Есть проблема. NPE. Бьет по репутации. Optional - одно из возможных решений. От тебя пока не поступило альтернативных пропозиций кроме операции "восклицательный знак" которая не покрывает рантайм. Анекдот про водку - хороший. Но эти метафоры не приближают никакого решения. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2018, 12:55 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonmikron, Надо решать проблемы по мере их поступления. Есть проблема. NPE. Бьет по репутации. Optional - одно из возможных решений. От тебя пока не поступило альтернативных пропозиций кроме операции "восклицательный знак" которая не покрывает рантайм. Анекдот про водку - хороший. Но эти метафоры не приближают никакого решения. Лутче чем решать проблемы - избегать проблемы. Моё конструктивное предложение: забудьте этот бред смутьянов и не делайте хуже. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2018, 13:42 |
|
|
start [/forum/topic.php?fid=59&msg=39679938&tid=2121883]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
68ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
others: | 327ms |
total: | 513ms |
0 / 0 |