powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Используете вы Optional ?
25 сообщений из 164, страница 3 из 7
Используете вы Optional ?
    #39678314
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никТакими темпами в .... превратишьсяне.
Мне больше нравится так:
collection?.Count без райзе.
Или:
String? s = null;

А необходимость сабжа прошла мимо моего сознания)
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678371
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronДиезДа, исторически null использовался для индикации того, что значение не возвращается, но такое решение крайне кривое по многим причинам.

Но оно уже сложилось. И два "Null" хуже чем один.

Категорически не согласен. Option - лишён детских болезней Null, поэтому это не второй нулл, а хорошее типобезопасное решение для описания опциональных значений.

А если говорить глобально про новые возможности ЯП - то наличие альтернативы всегда лучше ее отсутствия. А не нравится - не используйте :)
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678379
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,


А по поводу String! - оно тоже от NPE не защитит, хотя бы потому, что Null можно просетать через рефлексию.

В Scala, например, давно есть маркер NotNull, который делает ровно то же самое - запрещает на уровне компиляции присваивать нулл ссылочным типам. Так вот, от него хотят избавиться, потому что проблем с ним больше, чем пользы. Можете поискать обсуждения в инете...
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678402
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Optional нужен тогда когда контракт очень важен то есть если есть некий метод
Код: java
1.
2.
3.
4.
5.
interface MyService {

     Optional<Details> fetchDetails(int id);
    
}



То мне это даёт гарантии(конечно не 100%, но надежда есть) что не будет RuntimeException и что не будет null вместо ожидаемого Details. А метода map, flatMap делает код прямее. Опять же без согласия в команде по использованию Optional всё это не будет работать. Мне лично не хватает ещё из коробки Either что есть в Scala, но Optional уже не плохо.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678428
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GregTkконтракт очень важена когда он так важен, что нужно писать больше, сложнее и неочевиднее?
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678431
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123GregTkконтракт очень важена когда он так важен, что нужно писать больше, сложнее и неочевиднее?

Не уверен что я понимаю ваше определение сложнее и не очевиднее. Для меня сигнатура метода которая возвращает Optional говорит что метод не вернёт больше ничего кроме как Optional и мне уже становится легче и проще жить.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678439
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиезВ Scala, например, давно есть маркер NotNull, который делает ровно то же самое - запрещает на уровне компиляции присваивать нулл ссылочным типам. Так вот, от него хотят избавиться, потому что проблем с ним больше, чем пользы. Можете поискать обсуждения в инете...

В классическом scala коде просто нет никаких null, так что проблема надуманная, вообще если честно первый раз услышал про NotNull только сегодня.

Optional в Java кривой конечно, наивная попытка перетащить частичку ФП. Но без for-comprehension и монад это ненанмого упрощает жизнь.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678446
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GregTk,

Я примерно то же самое хотел написать по поводу усиления контракта в интерфейсе.

Но перед этим меня заинтересовал другой камент участника по поводу языков в которых нельзя создать неинициализированный указатель.

Дайте мне время подумать и я опишу этот поинт.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678450
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

Я читал твой ответ. Щас неудобно. Тайпаю с телефона. Отпишу вечером.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678519
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напомню про существование Bean Validation:

Код: java
1.
2.
3.
4.
5.
6.
7.
public class ReservationManagement {
 
    @NotNull
    public List<@NotNull Customer> getAllCustomers() {
        return null; //не может быть null и не может содержать в коллекции значения null
    }
}
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678547
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никДиезВ Scala, например, давно есть маркер NotNull, который делает ровно то же самое - запрещает на уровне компиляции присваивать нулл ссылочным типам. Так вот, от него хотят избавиться, потому что проблем с ним больше, чем пользы. Можете поискать обсуждения в инете...

В классическом scala коде просто нет никаких null, так что проблема надуманная, вообще если честно первый раз услышал про NotNull только сегодня.


Что за проблема? Я пытаюсь донести до товарища mikron , что пресловутый тип "String!" из следующего C# - это не панацея. Это уже было в скале, и признано ее создателями ошибочным решением.

забыл ник
Optional в Java кривой конечно, наивная попытка перетащить частичку ФП. Но без for-comprehension и монад это ненанмого упрощает жизнь.

Да, мы тут три года назад (ого!) уже об этом говорили. Но всё равно, даже с таким Optional лучше, чем без оного :)
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678577
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Диезно такое решение крайне кривое по многим причинам.смотрим причины:

ДиезПредставьте себе ЯП, в котором вообще нет null.
А такой есть?
Больше нет причин?
Интересно рассмотреть вопрос с разных сторон и со стороны разных парадигм и ЯП.

Lisp. В Лиспе Nil (null) имеет очень интересную семантику.

1. Он эквивалентен пустому списку. В примере второй и третий элемент равны по смыслу. Это также очень
тесно связано с внутренними структурами памяти. Память - бинарное дерево и пустой список и Nil это физические
указатели на определенную константу. Но "мыслимые" нами и транслятором как одно и тоже.

Код: java
1.
(1 nil ())



2. В булевом контексте Nil рассматривается как false.

Код: java
1.
2.
3.
4.
5.
(not nil)
T

(not T)
nil



О существовании NPE в Lisp я ничего не знаю. Возможно там есть какие-то классы ошибок связанные с разыменованием.
Если кто знает - прошу в топике поделится.

2. SQL. . Я много лет использую SQL. Но не общий диалект а Оракловый. Но здесь тоже есть некоторые наблюдения.

Oracle SQL постулирует определённую алгебру строк в которой пустая строка равна NULL. Это сделано давно из соображений
экономии памяти сегмента таблиц а также пространства индекса в блоках. В других СУБД - возможно по другому.

SQL (не только оракловый а вообще генерализованный) определяет семантику операций сравнения с null. Независимо
от аргументов результат операции сравнения будет равен FALSE (Undefined) если хотя-бы один из аргументов слева
или справа равен NULL. Забавен также факт что NULL не равен сам себе. NULL не участвует в операциях аналитики
и агрегации. Тоесть расчет AVG(field) будет просто скипать поля которые равны NULL.

Подытоживая эти два пункта я хочу сказать. Что в этих парадигмах программирования NULL вообще не является
проблемой разработки. Он скорее по другому определяет операции над Null значениями.

Null - не проблема. Проблема - семантика операций.

В классических ЯП семейства Java/C++/C# любая попытка разыменования типизированной Null-переменной вызовет
немедленную реакцию прерывания основного потока с выбросом различного рода исключений. В С++ может быть
разное поведение. Как говорится depends on.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678593
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronЯ считаю что это не проблема. Программисты совершают ошибки - они такие же люди.
Не будет NPE будут другие совершать. Поинт в том что Optinal не уменьшат риск появления ошибки.
Более того, программист может с таким же успехом совершить ошибку и вернуть null там где ожидается Optinal.
И если я пишу отказоустойчивый метод, то теперь к прверке на null добавится ешё isPresent.

Это интересный поинт. Я-бы его рассмотрел с разных сторон. Но в первую очередь я как человек дотошный
начал-бы с основ. Давай посмотрим что такое вообще Optional и что о нем пишет сайт производителя.

Я буду читать здесь. С вашего позволения я возьму просто последнюю версию (да щас это уже можно)
JDK API, в разделе Optional.

https://download.java.net/java/early_access/jdk11/docs/api/java.base/java/util/Optional.html

Цитата. Насколько мне позволяет мой слабый intermediate я дам творческий перевод. Если я где-то ошибся - можете дополнить.

public final class Optional<T> extends Object

Контейнер объекта который МОЖЕТ или НЕ-МОЖЕТ содержать не нулевое значение. Если значение есть - isPresent() вернет true. Если значения нет - объект рассматривается как пустой и isPresent() вернет false.

Дополнительные методы которые зависят от наличия или отсутствия значения предоставляются как orElse() (возвращает
дефолтное значение если основное значение отсутствует) и ifPresent ... и т д.

Это - value-based class, использование identity-sensitive операций (включая сравнение ссылок (==), сравнение хеш-кодов, и синхронизацию) на экземплярах Optional может иметь непредсказуемые резульатты и их следует избегать.

API Note:
Optional изначально введен для использования как метод возвращающий тип где четко нужно представить "отсутствие результата"
и где использование null, чрезвато возникновением ошибок. Переменная чей тип Optional, никогда не должна быть нулевой; у нас
всегда есть опциональный экземляр.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678602
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronЯ таки не понял в чём разница между null и optional. Так уж сложилось что null обозначает - обьекта нету.
Какое тайное знание передаёт мне Optional? Если оставить проповеди Java - веруюших - никакого.
Безполезное и даже вредное дополнение к яве и главниое - ничего не меняет.
А String! - даёт гарантию. Это не условность, и не апель к карзаботчику. Жосткий факт.
В результате код надёжнее, производителнее, компакнее. И время разработки умешается.
Реально сохраняет время/нервы/деньги владельцев софта.

Я думаю что польза или вред от Optional определяется практикой. В нашем случае - практикой защиты от NPE.
,Из таких практик я лично использовал.

1. Модульный тесты . Нудно. Скучно. За это неплатят. Я не всегда придерживаюст 100% покрытия (а у вас сколько только честно?).
В некоторых случаях (перед рефакторингом) я делал тест закрепления. Я специально толкал null везде где только
можно в модульных тестах в публичные методы и закреплял их через такие себе странные утверждения

Код: java
1.
@Test(expected = NullPointerException.class) public void assert_that_fucken_lookup_throws_npe_on_nullargs() {...}



2. Аннотации семейства jsr305. @Nulllable/@Nonnull Их понимает IDE и SonarQube. И если где-то есть нарушение контракта
на фазе статик-анализа кода то сонар или среда выкинет красный флажок. Это мой любимый метод закрепления
гарантий по NPE.

У них есть братья близнецы в пакетах sun и много еще где.

3. Фабричные методы. Лет 5 назад у нас были серъезные проблемы с биллингом для одного моб-провайдера.
Приложение Java/GWT. UI регулярно сыпался. Причем ловля NPE в GWT старых версий была настоящим мучением.
Обфускация и прочее. Мы достигли внутри группы опеределённх соглашений. Мы вообще отказались от конструкторов
для бизнес энтитей. Мы заменили их 100% на фабричные методы. Методы фабриковали нам объекты с полями
которые были инициализированы специальными магическими констатнами. Строки - "". Даты - дефолтная дата типа 0001 год
от Рождеста Христова. И если это обёртка числового типа - то соотв 0.0. Мы рассудили таким образом. Что левая
констана в UI не приносит столько демеджа сколько NPE. Это было согласовано и заэстимировано и реализовано.
Мы побороли 99% NPE. Дальнейшие фиксы были уже минорчиками. Кастомер был доволен.

4. EMPTY_LIST, EMPTY_MAP e.t.c. Это религия. Мы принципиально отказались от возврата NULL как признака
пустой коллекции. Забано. Но после этого код содержащий for(..) стал проще. Негативных эффектов не было.

Optional мы тогда (Java 1.6) не использовали. Возможно сейчась оглядываясь на 3-й пункт я-бы об этом подумал.
Те практики что мы использовали не были идеальны.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678684
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диезmikronпропущено...

Но оно уже сложилось. И два "Null" хуже чем один.

Option - лишён детских болезней Null, поэтому это не второй нулл, а хорошее типобезопасное решение для описания опциональных значений.

Звучит не плохо, но как обычное маркетингавое словоблудие.
Задави меня фактом, покажи: где детская болезнь?
хорошее типобезопасное решение: Почему хорошие, чем лучше, где польза от типабезопасности?
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678687
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диезmikronпропущено...

Но оно уже сложилось. И два "Null" хуже чем один.

А если говорить глобально про новые возможности ЯП - то наличие альтернативы всегда лучше ее отсутствия. А не нравится - не используйте :)
Вы восхваляли языки где нуля нет. Я воспользуюсь вашей аргументацией: null - алтернатива, которая обогощает. Значит можно добавить во все языки, где его нет:)
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678702
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,
Согласен с вами. Маркетингом пахнет.


забыл ник,

Scala не знаю. Не понял, как мне без null жить?
Если метод дайМнеВозраст() а база недоступна?
Или райзе форсмажор в середине подготовки ответа?


mayton,

Согласен. Коллекции тоже всегда создаю на выход, даже если пустая.
У меня соседний проект на шарпе. Вроде у них такой метод:
- всегда простые переменные не могут быть null пока не поставишь знак вопроса.
int i? = null разрешено.
Без вопросика запрещено.
Вроде изящное решение.
По умолчанию нигде не будет null )))
Imho
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678706
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123У меня соседний проект на шарпе. Вроде у них такой метод:
- всегда простые переменные не могут быть null пока не поставишь знак вопроса.
int i? = null разрешено.
Без вопросика запрещено.
Вроде изящное решение.
По умолчанию нигде не будет null )))
Imho
Мда. Я тоже слышал об этом. Дотнетчики пошли по пути изменения синтаксиса языка в угоду некоторым задачам разработки.

Насколько глубока эта проверка? Это фаза компилляции? Или рантайм?
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678708
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЦитата. Насколько мне позволяет мой слабый intermediate я дам творческий перевод. Если я где-то ошибся - можете дополнить.

public final class Optional<T> extends Object

Контейнер объекта который МОЖЕТ или НЕ-МОЖЕТ содержать не нулевое значение. Если значение есть - isPresent() вернет true. Если значения нет - объект рассматривается как пустой и isPresent() вернет false.

Дополнительные методы которые зависят от наличия или отсутствия значения предоставляются как orElse() (возвращает
дефолтное значение если основное значение отсутствует) и ifPresent ... и т д.

Это - value-based class, использование identity-sensitive операций (включая сравнение ссылок (==), сравнение хеш-кодов, и синхронизацию) на экземплярах Optional может иметь непредсказуемые резульатты и их следует избегать.

API Note:
Optional изначально введен для использования как метод возвращающий тип где четко нужно представить "отсутствие результата"
и где использование null, чрезвато возникновением ошибок. Переменная чей тип Optional, никогда не должна быть нулевой; у нас
всегда есть опциональный экземляр.


то что написано в жавадоке в точности соответствует 21598781 - не больше, не меньше, т.е. "A variable whose type is Optional should never itself be null; it should always point to an Optional instance." - это такая настоятельная рекомендация, а не часть языка, т.е. потенциально никто не мешает вместо Optional возвращать null, но делать так настоятельно не рекомендуется.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678712
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов, а меня еще интересует такой вопрос. Есть два DAO.
Один - декларирует безопасный способ возврата значения. Второй - классический.
Кто ответственен за отсутствие NPE в первом случае. В большей степени - автор
реализации SafeDao, или программист который это Dao использует.

Тоесть я хочу понять на чьей стороне будет мяч.

Код: java
1.
2.
3.
4.
5.
public class PotentiallySafeDao implements ISafeDao{

  public Optional<String> getName(String id);
  public Optional<Entity> getEntity(String id);
}



Код: java
1.
2.
3.
4.
5.
public class PotentiallyUnsafeDao implements IDao{

  public String getName(String id);
  public Entity getEntity(String id);
}
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678714
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GregTkOptional нужен тогда когда контракт очень важен то есть если есть некий метод
Код: java
1.
2.
3.
4.
5.
interface MyService {

     Optional<Details> fetchDetails(int id);
    
}



То мне это даёт гарантии(конечно не 100%, но надежда есть) что не будет RuntimeException и что не будет null вместо ожидаемого Details.
Кто тебе это гарантирует? Компилятор не гарантирует. И там где ты вызываеш featchDetail ты даже не знаешь кто этот метод реализовал. А писал его какой нибудь индус самоучка. А он тебе вообще ничего не обещал и не должен.
Ему так звёзды подсказали. Значит ты делаешь свой код надёжнее и отрабатываеш проверку на null. Или ты хочешь NPE в своем коде? Потребителю ведь не видно что у тебя там, и ему и не в домёк про того индуса.
Это реалии таковы.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678721
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНасколько глубока эта проверка? Это фаза компилляции? Или рантайм?
Компиляции. Но оставим C#, Optional проблема явы.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678733
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

Отлично берём некий код, который написан с возможностью выкинуть RuntimeException(нет соединения с сервисом или ещё хрен знает что) теперь оборачиваем код в try-catch и возвращаем Optional с нужными данными, таким простым способом я избавляюсь от side-effects в коде, который заведомо не безопасен без создания дополнительных моделей данных, а с использованием готового решения в лице Optional.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678735
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronmaytonНасколько глубока эта проверка? Это фаза компилляции? Или рантайм?
Компиляции. Но оставим C#, Optional проблема явы.
Ну ты хитер!

Всех взбаламутил. Втащил в тему обсуждение c#.
Рекомендовал синтаксис уровня компилляции.

А тепер говоришь - оставим!

Ну баламууут!
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678736
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronДиезпропущено...


Option - лишён детских болезней Null, поэтому это не второй нулл, а хорошее типобезопасное решение для описания опциональных значений.

Звучит не плохо, но как обычное маркетингавое словоблудие.
Задави меня фактом, покажи: где детская болезнь?


1. Null нельзя использовать в цепочке вычислений, получим NPE в случае отсутствия значения.
В случае Optional, EMPTY - обычный объект, поэтому можно писать конструкции вида
Код: java
1.
Optional.ofNullable(str).map(x -> x.length()).orElse(0);



2. null совместим по типу с любым reference-типом по определению, и проверка на null полностью лежит на программисте. С другой стороны String и Optional<String> - это два разных, несовместимых типа, поэтому потребуется явное приведение между ними (просто не получится "забыть" проверить на отсутствие значения)

А вообще, гуглить "billion dollar mistake".

mikronхорошее типобезопасное решение: Почему хорошие, чем лучше, где польза от типабезопасности?

[/quot]

В чем польза от типобезопасности? Это шутка такая? :)
Ну, многие любят JavaScript... Но мы тут, вроде, обсуждаем языки со строгой типизацией, не?
...
Рейтинг: 0 / 0
25 сообщений из 164, страница 3 из 7
Форумы / Java [игнор отключен] [закрыт для гостей] / Используете вы Optional ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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