powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Используете вы Optional ?
164 сообщений из 164, показаны все 7 страниц
Используете вы Optional ?
    #39060790
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в java 8 запихнули Optional из гуавы. Расскажите плиз пользуетесь ли вы этой новой фичей?

я просто пока не понял как она помогает очистить код от проверок на null и сделать его красивее.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39061127
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

Вот тут посмотрите 15.6

http://www.artima.com/pins1ed/case-classes-and-pattern-matching.html
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39061633
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где там говорится что код станет красивее? Он станет уродливее, но зато будет точнее видно где подразумевается ноль :)
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39061672
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько я понял, это позволяет отловить NULL значения и обработать их, как нужно программисту. В принципе, удобно, но не факт, что красиво.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39061680
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
private,

Суть не в красивостях, а в избавлении от отслеживания значений и проверки на null. Есть ещё всякие штуки вроде getOrElse
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39061682
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот ещё статья какая-то

http://habrahabr.ru/post/225641/
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39061808
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Суть не в красивостях, а в избавлении от отслеживания значений и проверки на null. Есть ещё всякие штуки вроде getOrElse

Я понимаю что за проблему пытаются решить с введением опционал. Но это на мой взгляд плохое решение. Это как челу с перкосом лица на одну сторону сделали пластическую операцию и оно у него перекосилось на другую, типа поправили :).

Если решать это то нужно было бы как-то пытаться интегрировать в систему типов явы, но поскольку сохранив обратную совместимость этого по-видимому сделать не удавалось - решили сделать такой костыль, который якобы помогает.

Хе-хе, да вот даже в примере по ссылке написано что это "то-же самое" что и с нулл.

авторif(person != null) {
System.out.println(person)
} else {
System.out.println("Person not found!");
}

То же самое, но с использованием Optional:

if (person.isPresent()) {
System.out.println(person.get());
} else {
System.out.println("Person not found!");
}


А это

авторPerson personNew = person != null ? person : new Person();

То же самое, но с использованием Optional:

Person personNew = person.orElse(new Person());

Ну надо-же, изобрели if / else, теперь эти конструкции можно делать не только с помошью встроенных функций языка, но надо еше и помнить кучу тарабарщины типа `orElse`, `orElseThrow` и т.п.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39061842
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
private,

По порядку тогда.

http://blog.jhades.org/java-8-how-to-use-optional/ What is wrong with just returning null?

The problem is that the caller of the function might not have read the javadoc for the method, and forget about handling the null case.

This happens frequently and is one of the main causes of null pointer exceptions, although not the only one.


http://blog.jhades.org/java-8-how-to-use-optional/ How does Optional help with functional programming?

In chained function calls, Optional provides method ifPresent(), that allows to chain functions that might not return values:

Код: java
1.
2.
findCustomerWithSSN(ssn).ifPresent(() ->  
    System.out.println("customer exists!"));





http://blog.jhades.org/java-8-how-to-use-optional/ What is Optional not trying to solve

Optional is not meant to be a mechanism to avoid all types of null pointers. The mandatory input parameters of methods and constructors still have to be tested for example.

Like when using null, Optional does not help with conveying the meaning of an absent value. In a similar way that null can mean many different things (value not found, etc.), so can an absent Optional value.

The caller of the method will still have to check the javadoc of the method for understanding the meaning of the absent Optional, in order to deal with it properly.

Also in a similar way that a checked exception can be caught in an empty block, nothing prevents the caller of calling get() and moving on.


Здесь ещё отличный пример использования. Мне вообще не очень понятно как вы хотите пользоваться Stream API без Optional, и не ловить NPE на каждом шаге?
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39062784
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
private...
авторif(person != null) {
System.out.println(person)
} else {
System.out.println("Person not found!");
}
...
То же самое, но с использованием Optional:

if (person.isPresent()) {
System.out.println(person.get());
} else {
System.out.println("Person not found!");
}



Документацию на API нужно читать однако, а то как был дураком так дураком и помрешь.
Код: java
1.
System.out.println(person.orElse("Person not found!"));
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39062814
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://dzone.com/articles/java-ptional-whats-point So to recap - in an attempt to get rid of NullPointerExceptions we have a new class that:
-Throws NullPointerExceptions
-Can itself be null, causing a NullPointerException
-Increases heap size
-Makes debugging more difficult
-Makes serializing objects, say as an XML or JSON for an external client, much more difficult
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39062818
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerв java 8 запихнули Optional из гуавы. Расскажите плиз пользуетесь ли вы этой новой фичей?

я просто пока не понял как она помогает очистить код от проверок на null и сделать его красивее.
Вот ещё
https://developer.atlassian.com/blog/2015/08/optional-broken/

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

vimbaSystem.out.println(person.orElse("Person not found!"));

тоже-самое что и

System.out.println(person != null ? person : "Person not found!");

авторДокументацию на API нужно читать однако, а то как был дураком так дураком и помрешь.

И в этом ты ошибаешься, то что ты начал читать АПИ вовсе не означает что ты перестал быть дураком. Попробуй напрягать мозги, может поможет.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39063347
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Мне вообще не очень понятно как вы хотите пользоваться Stream API без Optional, и не ловить NPE на каждом шаге?

Особо не смотрел еще стрим АПИ, не могу сказать, с первого взгляда не понравилось. В сравнении с Ruby / JavaScript - выглядит сложнее и запутаннее. Это обычные функции, непонятно зачем ради них делать специальный стрим апи.

Вспоминается совет одного из создателя Гуавы - по поводу ее использования и функционального стиля - ответ был - не нужно ее использовать, нужно испольовать обычные циклы. Жава слишком стара чтобы нормально в нее интегрировать функциональное программирование, у гуавы это не получилось, и судя по всему у стрим апи тоже не особо получится.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39063644
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
private,

privateОсобо не смотрел еще стрим АПИ
Не смотрел, но осуждаю (с)

[quote private]непонятно зачем ради них делать специальный стрим апи.[/private]
Совместимости ради

privateнужно испольовать обычные циклы.
С такими советами вам на форум С++. Лично я ничего плохого в эволюции языка не вижу, тем более, если она проходит в верном направлении.

privateу стрим апи тоже не особо получится.
По-моему уже получилось.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39063688
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,


Интересная статья. Могу предложить свою реализацию Optional. Это класс из моей библиотеки underscore-java. Он умеет хранить null внутри себя и .get() не выкидывает Exception.

С уважением, Валентин
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39063796
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot DoSOfRedRiver]

privateОсобо не смотрел еще стрим АПИ
Не смотрел, но осуждаю (с)

privateнепонятно зачем ради них делать специальный стрим апи.[/quot ]
Совместимости ради

privateнужно испольовать обычные циклы.
С такими советами вам на форум С++. Лично я ничего плохого в эволюции языка не вижу, тем более, если она проходит в верном направлении.

privateу стрим апи тоже не особо получится.
По-моему уже получилось.
Абсолютно согласен по каждому пункту. Вчера хотелось написать то же самое, но лениво было флейм разводить.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39064624
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valentin KolesnikovBlazkowicz,


Интересная статья. Могу предложить свою реализацию Optional. Это класс из моей библиотеки underscore-java. Он умеет хранить null внутри себя и .get() не выкидывает Exception.

С уважением, Валентин

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

Вот собственно ссылка .

Сложно было правильно составить equals и hashCode.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39064838
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin Kolesnikovquestioner,

Вот собственно ссылка .

Сложно было правильно составить equals и hashCode.

Нет, сложно было сделать столь много ошибок.
1. У Вас лишний boolean (который тривиально вычисляется). С учётом выравнивания- 8 байт лишних.
2. Кстати, у Вас бага - вызов "new Optional(null)" приведёт к созданию невалидного объекта.
3. get вполне может вернуть null. И зачем такое счастье?
4. У стандартного Optional есть константа EMPTY "раз и навсегда".
5. Там ещё и orElse и т.п. - удобные вещи.

Т.е. когда нет Optional, но хочется- лучше копипастить проверенные решения, а не изобретать ломучий велосипед.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39064858
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
privateЖава слишком стара чтобы нормально в нее интегрировать функциональное программирование,
к с++ лямбды пришили и мир не перевернулся
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39065382
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin Kolesnikov,

https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html This is a value-based class; use of identity-sensitive operations (including reference equality (==), identity hash code, or synchronization) on instances of Optional may have unpredictable results and should be avoided.

Зачем вам оно понадобилось - не понятно.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39065713
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin,

1. У Вас лишний boolean (который тривиально вычисляется). С учётом выравнивания- 8 байт лишних.

boolean даёт возможность хранить null внутри Optional.

2. Кстати, у Вас бага - вызов "new Optional(null)" приведёт к созданию невалидного объекта.

Это будет Optional со значением null внутри себя.

3. get вполне может вернуть null. И зачем такое счастье?

Мне нужен был get, который может вернуть null для методов в библиотеке.

4. У стандартного Optional есть константа EMPTY "раз и навсегда".

Можно добавить такую константу.

5. Там ещё и orElse и т.п. - удобные вещи.

Можно добавить такой метод. В guava он называется or().
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39065748
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin Kolesnikov2. Кстати, у Вас бага - вызов "new Optional(null)" приведёт к созданию невалидного объекта.

Это будет Optional со значением null внутри себя.


Т.е. у объекта есть три состояния- "значения нет", "значение есть, но оно null" и "значение есть"?
Вот уж багогенератор...
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39065913
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin,

Optional хранит внутри себя объект (null допустимое значение) и признак absent (если оно истнино значение бъекта устанавливается в null и доступно для .get()).

С уважением, Валентин
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39066552
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin KolesnikovAlexey Tomin,

Optional хранит внутри себя объект (null допустимое значение) и признак absent (если оно истнино значение бъекта устанавливается в null и доступно для .get()).

С уважением, Валентин

Тут одно из двух - либо null является допустимым значением (a.), либо null означает отсутствие значения (b.).

a.) Option(null) == Present(null) => Absent.get() должен выбрасывать exception
b.) Absent.get() == null => Option(null) должен возвращать Absent

В любом случае в вашей реализации я вижу логическую ошибку.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39066585
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какаято фуета,
зачем все это
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39066588
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диез,

Можно добавить для метода get() выкидывание Exception, если absent хранит истинное значение. Только NPE и так случится, если обращаться к методам для переменной со значением null.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39066592
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bochkov,

Это обсуждение статьи https://developer.atlassian.com/blog/2015/08/optional-broken/

У atlassian есть своя реализация Optional - класс Option. :)
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39073778
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диез,

Добавил выбрасывание IllegalStateException для метода get() в случае если absent == true,
появились методы fromNullable(final T nullableReference), or(final T defaultValue) и orNull().
Ссылка на код

С уважением, Валентин
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39078786
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin Kolesnikov,

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

Приятно, конечно, когда твои мысли находят отклик :)
Но то замечание было риторическим, по большому счету...

Тут я согласен с мембером private - не нужно тащить в Java идеологию функционального программирования.
Для этого есть Scala, Groovy и десятки прочих языков.

А для сильно желающих - есть fj, fugue итд. Какой смысл в еще одной библиотеке?
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39078946
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диез,

Если вопрос про библиотеку underscore-java, то в ней ей польза для написания похожего кода в JavaScript и java.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39078970
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin KolesnikovДиез,

Если вопрос про библиотеку underscore-java, то в ней ей польза для написания похожего кода в JavaScript и java.
JS:
Код: javascript
1.
_.map([1, 2, 3], function(num){ return num * 3; });



Java:
Код: java
1.
2.
3.
4.
5.
$.map(asList(1, 2, 3), new Function1<Integer, Integer>() {
    public Integer apply(Integer item) {
        return item * 3;
    }
});



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

Есть реализация всех методов из JavaScript библиотеки. Так будет выглядить код для метода map. Можно применить лямбды для JDK8.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39079003
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диез,

Пример кода с лямбда для JDK8:

Код: java
1.
$.map(asList(1, 2, 3), (num) -> num * 3);
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Используете вы Optional ?
    #39677964
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сегодня впервые увидал это чудо инженерной мысли.
Меня переполняют матерные слова.
Я мог бы понять, если бы такую ошибку дизайна сделал новичёк.
В Оракле, что, специалистов больше не осталось? Oдни маркетологовые крикуны да маразматики?
КАК, И ЧЕМ надо думать что бы ввести конструкцию, которая НИЧЕГО, абсолютно НИЧЕГО не улучшает и не упрощает,
но добавляет количество необходимых (машинных) инструкций И потребление памяти?
И даже проверки на уровне времени выполнения. НЕ компиляции. Маразм.
Меня одно одно интересует, покажите мне хоть одного разумного, кто это добровольно использует?
Кто нибудь вообще может подвести хоть какую нибудь разумную аргументацию для этого #@$#$#?
Смотрим на C# 8.0 - разумный продуманный дизайн. Почему в Java не могут так, сразу сделать правильно?
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678035
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я прочухал кайф от Optional
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678045
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronСмотрим на C# 8.0 - разумный продуманный дизайн. Почему в Java не могут так, сразу сделать правильно?
Я уже лет 10 не кодил на C#. И возможно там всё как-то стало красиво и кошерно.
И поэтому к вам вопрос.

Как у вас в C# решается проблема NPE или NullReferenceException (NRE) ?
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678053
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bochkovя прочухал кайф от Optional
так раскажи, что курить надо, чтоб так вставляло.
типа сидим, кодим а деньги идут?
Или может мне это надо и кучу времени или денег сбережёт?
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678055
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКак у вас в C# решается проблема NPE или NullReferenceException (NRE) ?
Так же как Overflow и OutOfMemmory - навешиванием шиздюлей программисту.
В общем случае. Но иногда можно будет избежать.
String! - обьект есть не нуль, компилятор гарантирует.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678077
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronmaytonКак у вас в C# решается проблема NPE или NullReferenceException (NRE) ?
Так же как Overflow и OutOfMemmory - навешиванием шиздюлей программисту.
В общем случае. Но иногда можно будет избежать.
String! - обьект есть не нуль, компилятор гарантирует.
1.
Тоесть ты считаешь что решение этой проблемы - не техническое а организационное?

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


NotNull типы и Option нужны для совершенно разных целей. Первое - для исключения null из набора допустимых значений. Второе - для явного возврата результата, который может иметь значение, а может не иметь.

Да, исторически null использовался для индикации того, что значение не возвращается, но такое решение крайне кривое по многим причинам.

Представьте себе ЯП, в котором вообще нет null. Как в нем указать, что метод может вернуть значение, а может не вернуть? Только вводя новый тип наподобие Optional.

PS. На такой толстый троллинг тут уже не ведется никто. Тоньше надо, со знанием дела
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678160
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonmikron Так же как Overflow и OutOfMemmory
1.
Тоесть ты считаешь что решение этой проблемы - не техническое а организационное?

Я считаю что это не проблема. Программисты совершают ошибки - они такие же люди.
Не будет NPE будут другие совершать. Поинт в том что Optinal не уменьшат риск появления ошибки.
Более того, программист может с таким же успехом совершить ошибку и вернуть null там где ожидается Optinal.
И если я пишу отказоустойчивый метод, то теперь к прверке на null добавится ешё isPresent.

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

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

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

Да полно.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678239
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мы используем и нам нравится
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678240
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никPetro123А такой есть?

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

Да полно.не хочу такой))

Такими темпами в вадю превратишься
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678306
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никPetro123А такой есть?

Да полно.
Это типа как с указателями в Java - указателей нет, а Null Pointer Exception есть! Бардак!
...
Рейтинг: 0 / 0
Используете вы 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
Используете вы Optional ?
    #39678737
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronНо оставим C#, Optional проблема явы.нет логики.
Чтобы в java не было проблем, надо знать как у других).
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678741
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronДиезпропущено...


А если говорить глобально про новые возможности ЯП - то наличие альтернативы всегда лучше ее отсутствия. А не нравится - не используйте :)
Вы восхваляли языки где нуля нет. Я воспользуюсь вашей аргументацией: null - алтернатива, которая обогощает. Значит можно добавить во все языки, где его нет:)

Ну, попробуйте добавить null в понимании Java/C# в какой-нибудь Haskell.
"Неинициализированное иммутабельное значение.." - мне кажется, это бред ))) . Подумайте тоже, ага?
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678745
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диезmikronпропущено...

Вы восхваляли языки где нуля нет. Я воспользуюсь вашей аргументацией: null - алтернатива, которая обогощает. Значит можно добавить во все языки, где его нет:)

Ну, попробуйте добавить null в понимании Java/C# в какой-нибудь Haskell.
"Неинициализированное иммутабельное значение.." - мне кажется, это бред ))) . Подумайте тоже, ага?
Отсутствие значения в аргументах функции хаскель васпринимает нормально. Он в качестве резалта генерирует новую функцию.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678751
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДиезпропущено...


Ну, попробуйте добавить null в понимании Java/C# в какой-нибудь Haskell.
"Неинициализированное иммутабельное значение.." - мне кажется, это бред ))) . Подумайте тоже, ага?
Отсутствие значения в аргументах функции хаскель васпринимает нормально. Он в качестве резалта генерирует новую функцию.

Это вы про частичное применение? Ну, тут нет неинициализированных значений, которые можно "потом" заполнить, как в случае переменных в ООП.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678753
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По моему только я и микрон сделали попытку расширить тему топика.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678763
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonАндрей Панфилов, а меня еще интересует такой вопрос. Есть два DAO.
Один - декларирует безопасный способ возврата значения. Второй - классический.
Кто ответственен за отсутствие NPE в первом случае. В большей степени - автор
реализации SafeDao, или программист который это Dao использует.Причем тут вообще ответственность? Если метод возвращает Optional, то это заставляет консьюмера заморочиться чтобы получить реальное значение, т.е. писать isPresent/get/orElse/orElseGet - сама по себе лапша с проверками на null никуда не делась - просто перешла из императивной в функциональную (это и есть предмет открытого спора: почему Optional в жаве такой кривой). Единственный профит здесь - это map/flatMap, они вроде как количество кода уменьшают, хотя с эстетической точки зрения код лучше не становится.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678766
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диез1. Null нельзя использовать в цепочке вычислений, получим NPE в случае отсутствия значения.
В случае Optional, EMPTY - обычный объект, поэтому можно писать конструкции вида
Код: java
1.
Optional.ofNullable(str).map(x -> x.length()).orElse(0);



Сравним:
Код: java
1.
 str == null ? 0 : str.length


Или тот же Црешётка Тут нет никакого подвоxа или скрытыx типов, один gолый null
Код: c#
1.
str?.Length??0
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678773
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диезmikronпропущено...

Вы восхваляли языки где нуля нет. Я воспользуюсь вашей аргументацией: null - алтернатива, которая обогощает. Значит можно добавить во все языки, где его нет:)

Ну, попробуйте добавить null в понимании Java/C# в какой-нибудь Haskell.
"Неинициализированное иммутабельное значение.." - мне кажется, это бред ))) . Подумайте тоже, ага?
Я не знаю этих языков, поэтому не понимаю вашу рагументацию.
Я хотел показать от противного - наличие алтернативы не всегда лутше.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678778
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диез
Код: java
1.
Optional.ofNullable(str).map(x -> x.length()).orElse(0);

Давайте немного поправим, а то совсем убого выглядит
Код: java
1.
Optional.ofNullable(str).map(String::length).orElse(0);
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678783
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловДиез
Код: java
1.
Optional.ofNullable(str).map(x -> x.length()).orElse(0);

Давайте немного поправим, а то совсем убого выглядит
Код: java
1.
Optional.ofNullable(str).map(String::length).orElse(0);



Хотел, чтобы было нагляднее для mikron. В C# же нет method references, как в Java
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678787
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronДиезпропущено...


Ну, попробуйте добавить null в понимании Java/C# в какой-нибудь Haskell.
"Неинициализированное иммутабельное значение.." - мне кажется, это бред ))) . Подумайте тоже, ага?
Я не знаю этих языков, поэтому не понимаю вашу рагументацию.
Я хотел показать от противного - наличие алтернативы не всегда лутше.

Вы пришли в раздел Java, подняли топик трехлетней давности, и начали в довольно агрессивном тоне критиковать разработчиков Java, при этом не вполне понимая, что ими двигало.
Ну какой тут конструктив может быть ? )) . Так, флейм на тему...

Сорри, сольюсь пожалуй, работать надо )
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678791
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиезВ C# же нет method references, как в Java
Есть, называются delegate.

ДиезNull нельзя использовать в цепочке вычислений, получим NPE в случае отсутствия значения.
ваше утверждение таким образом опровергнуто: Мои примеры показывают как легко null может итегрироватся в цепочку вычислений. И главное - даже пример на яве лаконичней и еффективней.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678796
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиезВы пришли в раздел Java, подняли топик трехлетней давности, и начали в довольно агрессивном тоне критиковать разработчиков Java, при этом не вполне понимая, что ими двигало.
Я пришёл спросить как себя чувствуйт другие.
А здесь есть разработчики явы? Если есть те кто придумал "Оптинал"? им откыто, прямым текстом - кретины!
Ко всем осталным отношения не имеет. Так что вы не обрашяйте внимания, это не к вам. Я не хотел вас обидет.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678799
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronДиезВ C# же нет method references, как в Java
Есть, называются delegate.


(facepalm)
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678804
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronЯ пришёл спросить как себя чувствуйт другие.
А здесь есть разработчики явы? Если есть те кто придумал "Оптинал"? им откыто, прямым текстом - кретины!
Ко всем осталным отношения не имеет. Так что вы не обрашяйте внимания, это не к вам. Я не хотел вас обидет.
Детский сад, вторая четверть. Ваша истерика нам очень важна. Пишите ещё.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678811
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я предлагаю не мешать функциональный ЯП и не функциональный.
Нахрена приводить языки где null нет или логика с null не используется?
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678902
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю что невозможно (не удастся) обсуждать сферический Optional в вакууме. Мы так или иначе в поисках альтернатив будем делать сравнения с другими яп, парадигмами и подходами. И это хорошо. А самое плохое - ругать не разобравшись.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678940
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123забыл ник,
Scala не знаю. Не понял, как мне без null жить?

Многие до сих пор без goto не могут. Подумай, зачем тебе вообще нужен null? Ты просто привык смотреть на программирование с точки зрения императивного языка. Мир меняется, функциональщина и декларативный подход лезет во все щели, пора самообразовываться, бро. Если так подумать, то null используется в двух местах - 1) когда не знаешь что вернуть из метода и идешь по пути наименьшего сопротивления, вместо создания NullObject или NullCollection ты просто возвращаешь нулл и живитесь как хотите:) 2) Когда некоторые переменные в классе неинициализированы. Тут можно долго холиварить о том, а нужен ли вообще изменяемый стейт(чем его меньше тем лучше тут думаю согласны все), и решается это созданием полностью инициализированного объекта с выполнением всех инвариантов, например через factory methods как писал mayton.
Оба эти случая лишь ведут к тому что программист плодит вероятные проблемы там, где их не было бы, не будь null.
Petro123Если метод дайМнеВозраст() а база недоступна?

Option конечно, но не кривой как в java.
Petro123Или райзе форсмажор в середине подготовки ответа?

Exceptions, null - это все side-effects, которых надо избегать, чтобы иметь мало-мальскую возможность "reason about code", к сожалению формат форума не подразумевает чтение лекции, в которой можно было бы обьяснить что это и главное, зачем это.

Отличие scala - в том что Option там это монада. Грубо говоря это абстракция, или контекст в котором происходит цепочка вычислений, результат следующего зависит от предыдущего. В каждой монаде запрограммировано как обрабатывать нестандартные результаты(отсутствие результата или неправильное значение и тд) и контекст сам решает как быть дальше, программисту просто надо писать бизнес-логику. В случае Option - если какая-то из функций цепочки вернет None(индикатор отсутствия результата) то вычислять цепочку далее бессмысленно, и результатом всего выражения будет None.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
   def employeeById(id:Int): Option[Employee] // принимаем Int возвращаем либо Some(employee) либо None
   def departmentByEmployee(emp:Employee): Option[Department] // принимаем Employee возвращаем либо Some(department) либо None
   def departmentEmail(dep:Department): Option[Email] // принимаем Department возвращаем либо Some(email) либо None


   def fetchEmail(id:Int) = {
       for {
            e <- employeeById(id)
            d <- departmentByEmployee(e)
            em <- departmentEmail(d)
       } yield em
}



Обрати внимание, все функции принимают конкретные объекты, а не Option. Задача распаковать\запаковать Option лежит на методах map и flatMap монады(в данном случае Option), твоя задача писать бизнес-логику а не париться о null и т.д. Но так как синтаксиса for{ <- }
в Java нету, то и Optional намного менее мощная и нужная штука.

Относится не только к Scala, а к любому декларативному языку, на самом деле я тоже долго не понимал почему Java так не любят, пока не потрудился и не разобрался с Haskell и попутно Scala. И хотя я до сих пор вижу некоторые преимущества в Java(не языке, а платформе и сообществе), но знание двух парадигм конкретно помогает посмотреть на код с разных сторон, так что рекомендую.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39678947
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Я предлагаю не мешать функциональный ЯП и не функциональный.
Нахрена приводить языки где null нет или логика с null не используется?

Так нахрена совать ФП концепт(Optional, Stream..) в сугубо императивный язык программирования?

Это был риторический вопрос, реалии таковы, что ФП идеи просачиваются в ООП языки, а не наоборот, ну и если делаете новые фичи, ну так делайте нормально. Есть подозрение что pattern-matching тоже кривой будет
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679020
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никМир меняется, функциональщина и декларативный подход лезетне верю что залезет)).
Про ООБД совсем недавно тоже пророчили.
Но РСУБД как была так и осталась.
Я за императивный код.
Но мысли твои интересные.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679119
Cheblin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
господа, идея Option проста как валенок...

если программа открывает порт, или файл, или парсит строку в цифру может случится исключение. сигнатура метода заставляет Вас быть готовым обработать это исключение либо переебросить его для обработки выше.
Вы не можете избежать этого.

в добавление к этому Option, также как и как исключения, будет заставлять програмиста быть готовым к обработке None.

That's it!
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679133
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheblinгоспода, идея Option проста как валенок...

если программа открывает порт, или файл, или парсит строку в цифру может случится исключение. сигнатура метода заставляет Вас быть готовым обработать это исключение либо переебросить его для обработки выше.
Вы не можете избежать этого.

в добавление к этому Option, также как и как исключения, будет заставлять програмиста быть готовым к обработке None.

That's it!

А обьяснишь чем это отличается от checked exceptions?:) Не все так просто
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679141
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CheblinNone
А что такое None и зачем быть готовым к его обработке?

например в ф-ции:

Код: java
1.
2.
3.
Integer Add( Integer a, Integer b ) {
   return new Integer( a.intValue() + b.intValue() );
}



Чем None лучше/хуже, чем выход за Integer.MAX_VALUE, Integer.MIN_VALUE ?
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679146
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если говорить об эффективности, то это "синтаксический сахар" который фактически приводит еще к одному уровню boxing/unboxing.
В общем, вещь явно совершенно не бесплатная

IMHO
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679175
Cheblin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что такое None и зачем быть готовым к его обработке?
сори в Rust е по-уши, машинально написал. надеюсь все поняли о чем я.

Leonid KudryavtsevА если говорить об эффективности, то .... вещь явно совершенно не бесплатная
хочется поговорить о эффективности Exceptions? не надо себя сдерживать.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679184
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,

чистые функции и борьба с side-effects наше всё :)
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679216
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheblinхочется поговорить о эффективности Exceptions? не надо себя сдерживать.
Ну раз "не сдерживать" )))

Зачем в реальные проекты тащить 100500 ново-модных классов и концепций, которые мало чем помогают - лично я не понимаю.

1) Иммутабельные объекты, это конечно круто - но это же полнейший п....ц производительности на банальных операциях. Что java.String, что java.Date. Простейшие требующиеся по бизнесу операции в РАЗЫ и НА ПОРЯДКИ ( 3-5, до десятков) раз медленнее.

Конвертация между различными code page, поищите в гугле, кому не хватает производительности, народ аж через Unsafe извращается ((((

2) Стандартные коллекции с атомик типами в бохсинге - перерасход ресурсов в разы (если большие коллекции данных, например для вычислений, то нормальные атомик коллекции - просто день и ночь по сравнению со стандартными), банальные проверка и арифметика с датами - на иммутабельных датах, так же полный писец (переписал на мутабельные JodaDate скорость улучшилась на порядки, потребление памяти стало равно 0).

3) Стримы... Ну видел я стримы в реальном проекте. Сказать, что бы код был более читабельный, нет, не сильно читабельный. Компактный... ну да, вместо 10 строк цикла, 2-3 строки на стримах.... Только, если Java код с циклом по ArrayList оптимизирует (JIT избавляется от array bound чекинг), то на стримах, легким движением руки, весь проход по коллекции оказался через "универсальный" iterator + array bound чекинг во весь рос - потяря производительно опять таки в разы (приложение: высоко нагруженный сервис). Понятно, что это была ошибка программиста и на стримах (в конкретных случаях) тоже код можно переписать так, что бы использовался специализированный интератор - только требования к знаниям стримов и опыту программиста уже становятся на порядок выше.

4) Гугле ProtoBuf - а кто нибудь из разработчиков вообще сам его запускал? Под каким нибудь профайлером? Создавать при де-сериализации ровно столкько же фабрик, сколько и элементов в коллекциии.... Бл.... Я когда на это наткнулся, мне вспомнились слова одного из начальников "человек который такое написал, должен был бы пойти в лес и закопаться".

5) ByteBuffers - документация заявляет, что создан для того, что бы при IO уменьшить кол-во копирований память-память. Реальные библиотеки (Apache HTTP Components) - все с точностью до наоборот. Т.к. обрашение к элементу в ByteBuffer на порядки дороже, чем к byte[] (уже упоминаемый мною array bound check + возможно native call), то одно сплошное "туда-сюда-обратно, тебе и мне приятно" (уже упоминаемое множ конвертация кодовых страниц String'а).

6) Лямбды - конечно круто и местами, удобно. Только про обработку эксепшенов в 99% забыли начисто.

7) когда работал на последнем Java проекте и читал И-нет, просто поразился, в скольких разных проектах и в скольки местах используется класс Unsafe... п...ц.... при многопоточном программирование - почти в любой серьезной либе, в каждом классе, по нескольку раз.

IMHO На самом деле, давно уже назрело полно изменений, которые требуют значительного пересмотра концепций языка. И включение в стандарт JRE/JIT. Но пока вместо этого - костыль на костыле и подпорка на подпорке. Поскольку язык живет уже давно, уже стали появлятся костыли которые подпирают подпорки и подпорки которые костылят старые костыли (((

Optional - одна из таких подпорок и костылей. Если без него не обойтись, то да, нужно/приходится использовать (я пока с этим не сталкивался) . Но тащить костыли в проекты и использовать их везде, где только можно, лично мне не понять.

Все по улицам ходят с палочками для селфи... и мы будем... и пофиг, что у нас даже смартфона нет, зато палочка для селфи - есть! Круто!
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679221
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никExceptions, null - это все side-effects, которых надо избегать, чтобы иметь мало-мальскую возможность "reason about code", к сожалению формат форума не подразумевает чтение лекции, в которой можно было бы обьяснить что это и главное, зачем это.

Отличие scala - в том что Option там это монада. Грубо говоря это абстракция, или контекст в котором происходит цепочка вычислений, результат следующего зависит от предыдущего. В каждой монаде запрограммировано как обрабатывать нестандартные результаты(отсутствие результата или неправильное значение и тд) и контекст сам решает как быть дальше, программисту просто надо писать бизнес-логику. В случае Option - если какая-то из функций цепочки вернет None(индикатор отсутствия результата) то вычислять цепочку далее бессмысленно, и результатом всего выражения будет None.

Не понял, почему exception и null это side-effects

Exception это банальная возможность прервать обработку и вернуть ошибку не взирая на глубину вложенности вызова (замена longjump в старом C), т.е. IMHO ровно один в один как Вы описываете
"В случае Option - если какая-то из функций цепочки вернет None(индикатор отсутствия результата) то вычислять цепочку далее бессмысленно, и результатом всего выражения будет None"

Чисто концептуально. Scala не знаю и даже не видел.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679227
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevCheblinNone
А что такое None и зачем быть готовым к его обработке?

например в ф-ции:

Код: java
1.
2.
3.
Integer Add( Integer a, Integer b ) {
   return new Integer( a.intValue() + b.intValue() );
}



Чем None лучше/хуже, чем выход за Integer.MAX_VALUE, Integer.MIN_VALUE ?

None(в других языках, не Java) лучше тем, что он ЯВНО описывает что что-то могло пойти не так, в случае же Integer.MIN_VALUE это банальный Integer, неотличимый для компилятора и программиста от Integer i = 0;
По идее это должно давать более типобезопасный код, переводя некоторые проверки на уровень компилятора и это круто, ведь мы не любим javascript, так? Другое дело как это реализовано в Java
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679229
Cheblin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гугле ProtoBuf
ловите наркомана он ProtoBuf запускал.... ;)
именно поэтому и появился https://github.com/cheblin/BlackBox] BlackBox

не мой взгляд лучшее, что могло бы случиться с java уже произошло - SCALA. но на данном форуме, это вероятно экстремизм.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679230
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevА если говорить об эффективности, то это "синтаксический сахар" который фактически приводит еще к одному уровню boxing/unboxing.
В общем, вещь явно совершенно не бесплатная

IMHO

Только потому что java-компилятор не умеет инлайнить такой синтаксический сахар. Да и в принципе аргумент такой с натяжечкой.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679233
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevCheblinхочется поговорить о эффективности Exceptions? не надо себя сдерживать.
Ну раз "не сдерживать" )))

Зачем в реальные проекты тащить 100500 ново-модных классов и концепций, которые мало чем помогают - лично я не понимаю.

1) Иммутабельные объекты, это конечно круто - но это же полнейший п....ц производительности на банальных операциях. Что java.String, что java.Date. Простейшие требующиеся по бизнесу операции в РАЗЫ и НА ПОРЯДКИ ( 3-5, до десятков) раз медленнее.

Конвертация между различными code page, поищите в гугле, кому не хватает производительности, народ аж через Unsafe извращается ((((

2) Стандартные коллекции с атомик типами в бохсинге - перерасход ресурсов в разы (если большие коллекции данных, например для вычислений, то нормальные атомик коллекции - просто день и ночь по сравнению со стандартными), банальные проверка и арифметика с датами - на иммутабельных датах, так же полный писец (переписал на мутабельные JodaDate скорость улучшилась на порядки, потребление памяти стало равно 0).

3) Стримы... Ну видел я стримы в реальном проекте. Сказать, что бы код был более читабельный, нет, не сильно читабельный. Компактный... ну да, вместо 10 строк цикла, 2-3 строки на стримах.... Только, если Java код с циклом по ArrayList оптимизирует (JIT избавляется от array bound чекинг), то на стримах, легким движением руки, весь проход по коллекции оказался через "универсальный" iterator + array bound чекинг во весь рос - потяря производительно опять таки в разы (приложение: высоко нагруженный сервис). Понятно, что это была ошибка программиста и на стримах (в конкретных случаях) тоже код можно переписать так, что бы использовался специализированный интератор - только требования к знаниям стримов и опыту программиста уже становятся на порядок выше.

4) Гугле ProtoBuf - а кто нибудь из разработчиков вообще сам его запускал? Под каким нибудь профайлером? Создавать при де-сериализации ровно столкько же фабрик, сколько и элементов в коллекциии.... Бл.... Я когда на это наткнулся, мне вспомнились слова одного из начальников "человек который такое написал, должен был бы пойти в лес и закопаться".

5) ByteBuffers - документация заявляет, что создан для того, что бы при IO уменьшить кол-во копирований память-память. Реальные библиотеки (Apache HTTP Components) - все с точностью до наоборот. Т.к. обрашение к элементу в ByteBuffer на порядки дороже, чем к byte[] (уже упоминаемый мною array bound check + возможно native call), то одно сплошное "туда-сюда-обратно, тебе и мне приятно" (уже упоминаемое множ конвертация кодовых страниц String'а).

6) Лямбды - конечно круто и местами, удобно. Только про обработку эксепшенов в 99% забыли начисто.

7) когда работал на последнем Java проекте и читал И-нет, просто поразился, в скольких разных проектах и в скольки местах используется класс Unsafe... п...ц.... при многопоточном программирование - почти в любой серьезной либе, в каждом классе, по нескольку раз.

IMHO На самом деле, давно уже назрело полно изменений, которые требуют значительного пересмотра концепций языка. И включение в стандарт JRE/JIT. Но пока вместо этого - костыль на костыле и подпорка на подпорке. Поскольку язык живет уже давно, уже стали появлятся костыли которые подпирают подпорки и подпорки которые костылят старые костыли (((

Optional - одна из таких подпорок и костылей. Если без него не обойтись, то да, нужно/приходится использовать (я пока с этим не сталкивался) . Но тащить костыли в проекты и использовать их везде, где только можно, лично мне не понять.

Все по улицам ходят с палочками для селфи... и мы будем... и пофиг, что у нас даже смартфона нет, зато палочка для селфи - есть! Круто!


Ну вот да, по нмогим пунктам согласен, но это не вина концепции, а вина тех кто криво перетаскивает функциональность из ФП в императивную Java + попытка сохранить backward compatibility
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679238
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevНе понял, почему exception и null это side-effects

Exception это банальная возможность прервать обработку и вернуть ошибку не взирая на глубину вложенности вызова (замена longjump в старом C), т.е. IMHO ровно один в один как Вы описываете
"В случае Option - если какая-то из функций цепочки вернет None(индикатор отсутствия результата) то вычислять цепочку далее бессмысленно, и результатом всего выражения будет None"

Чисто концептуально. Scala не знаю и даже не видел.

Exceptiion является side-effect именно потому, что он влияет на control-flow программы непредсказуемым образом, "чистые" функции из ФП, всегда должны возвращать некое значение(зависимое от инпута, и при чем одно и тоже для одного и того же инпута). Поэтому в ФП не кидают эксепшен, а возвращают Either[Result, Exception]. По сути Either это развитие концепции Optional, только он описывает не только что "что-то пошло не так", а может вернуть либо значение либо описание ошибки. И именно поэтому в стримах никаких Exception нет, и не может быть by-design.

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

В скале хватает своего WTF, но то что прочищает мозги и заставляет посмотреть на программирование с другой стороны - это да.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679247
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никCheblinне мой взгляд лучшее, что могло бы случиться с java уже произошло - SCALA. но на данном форуме, это вероятно экстремизм.

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


В скале хватает своего WTF, но то что прочищает мозги и заставляет посмотреть на программирование с другой стороны - это да.
При ФП нет состояния. Для меня это непреодолимый рубеж)).

Состояние - зло, боишься копий? Ну раньше тоже боялись уходить от HttpSession, а поди ж ты как оно сейчас
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679254
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,
)))
Я не хочу чтобы машина была умнее меня
https://habr.com/post/303312/
)))
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679255
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никТолько потому что java-компилятор не умеет инлайнить такой синтаксический сахар. Да и в принципе аргумент такой с натяжечкой.
Так он же не "синтаксический сахар". Это просто класс и экзепляр класса в куче (память, перформанс)

На правах бреда:

Сделали бы реальный "синтаксический сахар", взяли бы например стандартное C'ное обозначение ->, но не NPE кидали, а просто возвращали бы null. Хотя не очень понятно, что возврашать, если результат атомарный тип

String s = billsCollection->findById( billId )->getCustomer()->getAddress()->getStreet()->getName()->toString();

Было бы и удобно и лаконично (хотя с точки зрения синтаксиса, было бы удобнее наоборот: при -> кидать NPE, а при . не кидать ((( )

Для работы с атомарными типами, можно было бы ввести операцию .?

int i = address -? getHouseNumber() : 0;
+ разрешение на exception
int i = address -? getHouseNumber() : throw new NullPointerException();
+ длинная запись операции ->
Street street = address -? getStreet() : NULL;

С Optional же, все осталось по старому. Много букв + мусор в heap (((

Работа выполнена успешно, положительный результат не достигнут ( C )


забыл ник....
"чистые" функции из ФП, всегда должны возвращать некое значение(зависимое от инпута, и при чем одно и тоже для одного и того же инпута). Поэтому в ФП не кидают эксепшен, а возвращают Either[Result, Exception]. По сути Either это развитие концепции Optional, только он описывает не только что "что-то пошло не так", а может вернуть либо значение либо описание ошибки. И именно поэтому в стримах никаких Exception нет, и не может быть by-design.
...
На мой взгляд, это и называется "костыль"

- У нас все ф-ции чистые!
- Но у меня не получается (( У меня ф-ция грязная (((
- Не беда! Заверните грязную ф-цию в чистое полотенце, она будет считаться чистой !

100% костыль )))
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679261
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevНу раз "не сдерживать" )))
...
1) Иммутабельные объекты, это конечно круто - но это же полнейший п....ц производительности на банальных операциях. Что java.String, что java.Date.
...
банальные проверка и арифметика с датами - на иммутабельных датах, так же полный писец (переписал на мутабельные JodaDate скорость улучшилась на порядки, потребление памяти стало равно 0).


Стоп-стоп! Строго наоборот - стандартный java.util.Date - мутабельный . Объекты из Joda Time - иммутабельные .

Вы уверены, что сделали правильные выводы?
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679269
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиезСтоп-стоп! Строго наоборот - стандартный java.util.Date - мутабельный . Объекты из Joda Time - иммутабельные .

Я имел в виду "новые" из пакета java.time, а не "старые" из java.lang.Object )))
Т.к. в старых ни тайм зон, ни нормальной арифметики.

В Joda Time - два комплекта классов. Иммутабельная + мутабельная версии

на самом деле, в принципе, я в результате почти всю арифметику на long в миллисикундах перевел. Честно говоря, сейчас даже не очень вспомню, зачем мне Joda Time в вычислениях был нужен... но зачем-то использовал
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679274
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevТак он же не "синтаксический сахар". Это просто класс и экзепляр класса в куче (память, перформанс)

Он то есть, в Java. Мне в принципе непонятно почему до сих пор этот боксинг\автобоксинг и враппинг не инлайнится. Сколько раз вам нужен был объект Integer именно как объект? А не враппер над примитивным типом? В той же scala опять же нету примитивных типов, есть тип Int с кучей методов, но компилятор умный, и транслирует все в JVM-ный int, в коде красота, в хипе порядок. То же самое можно сделать и с Optional и т.д.
Leonid KudryavtsevНа правах бреда:
С Optional же, все осталось по старому. Много букв + мусор в heap (((
Работа выполнена успешно, положительный результат не достигнут ( C )

Так по поводу java-шного optional я и не спорю, просто я знаю как оно должно работать в принципе(концепт) и его реализация в java вызывает недоумение.

Leonid KudryavtsevНа мой взгляд, это и называется "костыль"
- У нас все ф-ции чистые!
- Но у меня не получается (( У меня ф-ция грязная (((
- Не беда! Заверните грязную ф-цию в чистое полотенце, она будет считаться чистой !
100% костыль )))

В JVM да, именно из-за наличия null и exceptions наследия трудно быть в чем-то уверенным, если не пишешь все сам:) Но это не проблема подхода в целом, это проблема реализации ФП-ных плюшек в Java. Scala тоже страдает из-за этого кстати, но в меньшей степени.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679279
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никPetro123Я предлагаю не мешать функциональный ЯП и не функциональный.
Нахрена приводить языки где null нет или логика с null не используется?

Так нахрена совать ФП концепт(Optional, Stream..) в сугубо императивный язык программирования?

Это был риторический вопрос, реалии таковы, что ФП идеи просачиваются в ООП языки, а не наоборот, ну и если делаете новые фичи, ну так делайте нормально. Есть подозрение что pattern-matching тоже кривой будет
Уже зареган джеп. От самого Брайана Гоетца. В статусе кандидата пока.

http://openjdk.java.net/jeps/305
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679281
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonзабыл никпропущено...


Так нахрена совать ФП концепт(Optional, Stream..) в сугубо императивный язык программирования?

Это был риторический вопрос, реалии таковы, что ФП идеи просачиваются в ООП языки, а не наоборот, ну и если делаете новые фичи, ну так делайте нормально. Есть подозрение что pattern-matching тоже кривой будет
Уже зареган джеп. От самого Брайана Гоетца. В статусе кандидата пока.

http://openjdk.java.net/jeps/305

Та я в курсе:) Читал Шетца еще полгода назад, аналога case классов вводить в Java не собираются, как и алгебраические типы данных, а в сочетании АДТ и паттерн матчинга вся соль. Будет также как и с опшионал без монад:) Ну посмотрим как оно в итоге будет конечно
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679284
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevДиезСтоп-стоп! Строго наоборот - стандартный java.util.Date - мутабельный . Объекты из Joda Time - иммутабельные .

Я имел в виду "новые" из пакета java.time, а не "старые" из java.lang.Object )))
Т.к. в старых ни тайм зон, ни нормальной арифметики.

В Joda Time - два комплекта классов. Иммутабельная + мутабельная версии

на самом деле, в принципе, я в результате почти всю арифметику на long в миллисикундах перевел. Честно говоря, сейчас даже не очень вспомню, зачем мне Joda Time в вычислениях был нужен... но зачем-то использовал

Ок, убедили )
Если не секрет, каким классом задач вы занимаетесь?
Мне давно не требовался такой уровень оптимизации для задач. Последнее, что помню - FastUtils для примитивных коллекций, да и то потом перетащили на нативный inmemory движок через shared memory.
Для текущих бизнес-задач предсказуемость поведения важнее производительности внутри процесса.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679287
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevА если говорить об эффективности, то это "синтаксический сахар" который фактически приводит еще к одному уровню boxing/unboxing.
В общем, вещь явно совершенно не бесплатная

IMHO
Я поспешу вас успокоить. Разумеется мы понесем свою плату за еще один паттерн.
Но давайте вспомним фразу которую сказал один участник несколько страниц назад.

Код: java
1.
billion dollar mistake



Это суммарная цена. Но я-бы сюда еще добавил наши с вами репутационные
потери. Когда наш код который писали мы, внезапно обнаруживает пустой объект
вместо ожидаемого непустого - то фраза "обосрались" - это самая мягкая фраза
которую мы можем сказать. Уже прошло без малого 100 лет со времен Алана Тюринга
но мы позволяем себе допускать подобное. Это - роспись в некомпетентности.

А теперь цифры. Как вы думаете? Какой % потенциальных NPE мы закроем если
будем внедрять Options в наши новые бизнес сущности такие как скажем Dao, Repositary,
Entity/DTO/Pojo. Мне кажется.... 80%. Почему 80? Не знаю взял 4 к 1. Нравится
мне эта пропорция. Но если вы не согласны - я готов заслушать вашу оценку.

По перформансу. Разумеется мы не экстремисты и не собираемся покрывать
опшенами системные и другие библиотеки. Я-бы покрыл меж-модульное взаимодействие.
Везде где есть некая граница где ходят бизнес объекты. И я вангую что на самом
деле потери на этом у нас будут небольшие. 1-5%. Потери на тернарный оператор
завёрнутый в коробочку. Сюда еще можно добавить расходы на GC, но они у нас
уже учтены в количестве продуцируемых бизнес-объектов в коробочках. Графов
и циклических ссылок на опшенах не предвидится. GC справится с ними. В 1 шаге
достижимости от бизнес-объекта. Тоесть 1-5 % нагрузки CPU - это тот налог который я готов
заплатить за стабильность.

Давайте также вспомним что компиллятор умён и уже умеет делать прозрачными
getters/setters. Он умеет покрывать интринзиками наиболее горячие системные
вызовы такие как java.lang.String::substr() e.t.c. И если действительно так выйдет
что Option - горячий объект. И это объект пространства имен java.lang то я думаю
что регулировка перформанса на нём будет выполнена на другом уровне. Возможно
даже в компилляторе.

А вот чего я-бы точно не стал делать - так это переписывать код который уже есть
и протестирован. Тут как-бы ясно. Я - достаточно ленив в этом плане.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679291
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУже зареган джеп. От самого Брайана Гоетца. В статусе кандидата пока.

http://openjdk.java.net/jeps/305
По мойму, какой-то бред.

if, case с проверкой на тип - это какой-то говнокод ((( IMHO (((

В ООП парадигме или общую логику (в примере Brian Goetz форматирование обхекта для вывода) надо выносить в предка (пример Object.toString() ), или, тогда уж, делать перегрузки операторов/функций наподобие << и >> для потоков ввода-вывода в C++.

Т.е. a la генерик классы/методы, но наоборот. Перегруженные классы/методы (к сожалению глобальных ф-ций в отличие от C нет), конкретная реализация которых определяется в RunTime по реальному типу параметров. В C++ вроде такое можно.

Появился новый тип(класс), для которого нужно добавить правило форматирования. Создал имплементаци/перегрузку класса Formatter. Существующий код его подхватил. Не нужно добавлять еще одни ветки if или case в сущ. программу.

Своего рода, получились бы динамические plugin'ы на уровне языка. Но не понятно, как описывать это компактно (т.к. каждый раз делать класс - крайне много букв). Ну и как-то приходим к JavaScript'у (((

т.к. по правильному, весь код Brian Goetz можно было бы сделать в виде HashMap<Class, Formatter>, зарегистрировать форматтеры для каждого типа/класса и весь код свести к
return (Formatter)configuration.get( val.getClass() ).formatValue( val );

IMHO & AFAIK
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679292
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevт.к. по правильному, весь код Brian Goetz можно было бы сделать в виде HashMap<Class, Formatter>, зарегистрировать форматтеры для каждого типа/класса и весь код свести к
return (Formatter)configuration.get( val.getClass() ).formatValue( val );

IMHO & AFAIK

Мыслите в правильном направлении. Но тут все еще интереснее, ООП и ФП по сути дуальны, есть такая задача, называется Expression Problem, она о том, как много надо усилий чтобы писать расширяемый код. ООП идет по пути - все операции описывать в интерфейсе, а имплементации добавлять в сабклассы. Таким образом легко расширить имплементации, но архисложно добавить новую операцию. В ФП все ровно наоборот. Там нет стейта, и entities это просто сборище полей без логики(привет anemic model), в таком случае паттерн матчинг самое оно. Любая операция это по сути паттерн матчинг на всем множестве типов(гарантировано компилятором) и операции соотвественно добавлять легко, а вот тип данных добавить сложно, ибо надо модифицировать все операции.

На самом деле все решаемо как в рамках ООП(Object Algebra) так и ФП(Type classes), благодаря которым можно добавлять как новые имплементации так и операции не меняя существующий код.

К чему сей пассаж. А к тому что паттерн матчинг - моджно стильно молодежно, НО в ФП языках, где он действительно дает преимущества и нужен, а тут опять тянут абы было:)
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679294
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonто фраза "обосрались" - это самая мягкая фраза

+ плюсуюсь
когда разрабатывал под Oracle CC&B, мы грустно шутили, что в Java существует только одна ошибка:
Null pointer exception
никаких других ошибок от приложения - мы даже и не видели (((

maytonА теперь цифры. Как вы думаете? Какой % потенциальных NPE мы закроем если
будем внедрять Options в наши новые бизнес сущности такие как скажем Dao, Repositary,
Entity/DTO/Pojo. Мне кажется.... 80%. Почему 80? Не знаю взял 4 к 1. Нравится
мне эта пропорция.

С цифрой 80% я согласен. Но вот с ее интерпретацией.
Т.к. 20% от "обосрались" == "обосрались"
Запашок уже есть, в приличный ресторан/ночный клуб/бордель уже не пустят
Тут, что 100%, что 20% - одинаково.

maytonТоесть 1-5 % нагрузки CPU - это тот налог который я готов заплатить за стабильность.

Да хоть 50%.
Проблема в том, что от "обосрались" с Optional мы не избавимся. Те же проверки, только вид с боку.

Был null, теперь будет null вложенный в Optional.

Была ошибка Null Pointer Exception, будет ошибка NoSuchElementException.
(смотрю доку по Optional: get() - If a value is present in this Optional, returns the value, otherwise throws NoSuchElementException.)
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679300
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никК чему сей пассаж. А к тому что паттерн матчинг - моджно стильно молодежно, НО в ФП языках, где он действительно дает преимущества и нужен, а тут опять тянут абы было:)
Я скажу честно что целиком я не читал идею Брайена. Паттерн матчинг видел в Scala.
Но из опыта Java могу предположить что создатели очень-очень неохотно меняют
language во взаимодействии с текущим статусом виртуальной машины.

Яркий пример - Java Generics. По сути это вообще никакие не Generics а просто
дополнительные уровни строгости в фазе компилляции. JVM при этом остаётся
в неведении относительно собранного в бинарник generic.

Switch со строковым аргументом шёл очень долго. Ничто не мешало его запилить
в ранних версиях. Но очевидно кто-то очень сильно хотел взаимного однозначного
соответствия байткода и исходника. Машинная инструкция tableswitch - тому
подтверждение. Она работает с целыми числами.

Подозреваю что с паттерн матчингом будет таже-история. Сделать-то может
сделают но будет какой-то ограниченный вариант.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679303
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Главное, не понятен сокральный смысл null в Java

В C, NULL это просто.... 0 (НОЛЬ!). Стандартное значение для непроинициализированного указателя.

В Java, не проинициализированных переменных быть вообще не может, попытка обращения к непроинициализированной переменой, ошибка на этапе компиляции.

То что же такое null в Java? Может его вообще просто из языка исключить? Не будет такого слова, не будет и проблемы )))

По факту, если программист написал процедуру, которая возвращает null, задача программиста этот возврат проверить. Никакой Optional ничего не поменяет. Если процедура вернула Optional, задача программиста проверить есть ли значение в данном Optional.

Проблема то только в том, что сейчас кода стало очень много. Вот я никогда длинную портянку через точку ни пишу. Но сейчас, 100500 вызовов через точку, общепринятый стил (например паттер Builder) (((

Понятно, что при таком стиле, NPE стали проблемой. И не только само NPE, но еще и локализация его место возникновения. (т.к. ссылки на строчку в коде уже не достаточно).

Пока программы писали олд скульные разработчики, null и NPE особо никого не нервировали. Как только код программы стал "паттерн на петтерне, геттер на геттере, стильно модно молодежно" NPE стали валится в самых неожиданных местах.

IMHO & AFAIK
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679304
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну есть класс проверок которые компилятор видит. Это "восклицательный знак" возле декларации типа в шарпах о котором так эмоционально говорил микрон.

Но что делать с динамикой? Что делать с кодом который появится только в рантайме?
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679349
Cheblin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,
В C, NULL это просто.... 0 (НОЛЬ!). Стандартное значение для непроинициализированного указателя.
нет.
Стандартное значение для непроинициализированного указателя, рандомный мусор.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679377
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 Ораклом таки сказывается, при этом негативно: движение есть - результата нет.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679378
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНо что делать с динамикой? Что делать с кодом который появится только в рантайме?
Не пойму. Это ведь логика программы. Это задача программиста.
Значит код пошел не предсказуемым образом как ПЛАНИРОВАЛ программист.
От этого нет защиты как от деления на ноль.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679381
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123maytonНо что делать с динамикой? Что делать с кодом который появится только в рантайме?
Не пойму. Это ведь логика программы. Это задача программиста.
Значит код пошел не предсказуемым образом как ПЛАНИРОВАЛ программист.
От этого нет защиты как от деления на ноль.
В коде всегда есть интерфейсы которые реализовывал кто-то другой.
В использовании мы обычно оптимисты. Мы , когда прототипируем , всегда полагаем что string это строка и
Никаких других состояний быть не может. Мы считали что контракт сильный. И мы - не параноики чтобы каждый раз ставить проверки условия кажущуюся очевидность. Мы - в меру ленивы.

Что даёт optional? Молчаливое напоминание. Напоминание а том что есть варианты. Варианты волучения нашего string.

get с генерацией нового класса исключений.

getOrElse где мы обязаны указать альтернативу.

orElseGet с указанием функции разрешения опционала.

orElseThrow с указанием функции генерации нашего типа исключения в зависимости от ситуации.

Разумеется я не тешу себя иллюзиями по поводу того что программист правильно выберет нужный метод вскрытия коробочки.
Но протокол получает определенные критерии строгости. Обычное разыменование (string)nulll уже не работает. Работает коробочка.

Самый первый метод требует предварительной проверки isPresent. По крайней мере среда разработки это видит.

Кстати sonarqube и findbug обладают слепотой относительно анализа использования интерфейса реализация которого неизвестна в фазе компиляции.
Они также считают что поставщик всегда вернет что то непустое.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679432
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диезmikronпропущено...
покажи: где детская болезнь?


1. Null нельзя использовать в цепочке вычислений, получим NPE в случае отсутствия значения.

Первый аргумент уже опровергнут примером. Займёмся вторым.

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


Помоему логично - если обьекта нет то о типе обьекта не может быть речи.
Глупо рассуждать о типе теста в дырке от бублика.
Но это обстрактно. Покажи на примере что ты имееш в виду.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679440
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczДетский сад, вторая четверть. Ваша истерика нам очень важна. Пишите ещё.
Мы тут аргументами и логикой занимаемся а не моралью.
Проповеди - мешают. проходи мимо, если нечего сказать по делу.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679475
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Код: java
1.
billion dollar mistake




Чистый PR. Звучит красиво: "мы нашли 1М$ ошибку"
или "мы исправили1М$ ошибку". Хочется каждому дать премию и повесить на доску почёта.

maytonА теперь цифры. Как вы думаете? Какой % потенциальных NPE мы закроем если
будем внедрять Options в наши новые бизнес сущности такие как скажем Dao, Repositary,
Entity/DTO/Pojo. Мне кажется.... 80%. Почему 80? Не знаю взял 4 к 1. Нравится
мне эта пропорция. Но если вы не согласны - я готов заслушать вашу оценку.


Реально - 0. Люди как совершали ошибки так и будут их совершать.
Компилятор (машина) в данном случае им нечем помочь не может.
Оптинал сам - обьект и подвержен тем-же опасностям.

Я так думаю: если бы Оптионал был всегда, с самого первого дня, то можно было бы отверждать и требовать что любое возврашаемое значение из функции обязателно сушествует. Это позволило бы избежать ненужных проверок в вызываюшем коде если метод возврашает тип а не оптионал<тип>.

Другими словами можно было бы утверждать
Код: java
1.
2.
3.
4.
5.
interface Person
{
         String getName();
         Optional<String> getNickname();
}


Метод getName всегда возврашает значение. И проверок на наличие значения в вызываюшем коде не делать.
Метод getNickname имеет оптионалное значение. Проверки нужны. И компилятор мог бы это проверять.
Другими словами плюс Optinal был бы втом что есть "не оптионал".

Но сейчас есть куча кода кототрый уже никто не будет переписывать.
Есть куча методов которые возврашают null.
Следовательно нельзя обеспечить соблюдение первого утверждения.
И таким образом сейча плюса - нет. А вот минусы в потреблении пямяти и циклов процессора есть.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679494
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronЧистый PR. Звучит красиво: "мы нашли 1М$ ошибку"
или "мы исправили1М$ ошибку". Хочется каждому дать премию и повесить на доску почёта.
Боже, какой бред. То есть ты даже не потрудился почитать статью? Какой, в дырку от бублика, пиар. Речь о том что если бы в null reference изначально распознали бы вселенское зло ещё в далёком 1965 году, то это могло бы съэкономить массу времени в современной разработке.
https://en.wikipedia.org/wiki/Tony_Hoare
Это даже к Java отношения не имеет. Зачем так кичиться своим невежеством мне не совсем понятно.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679501
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679506
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно что в c/c++ раньше различали null pointer и wild pointer. Как бы два состояния. Щас наверное зависит от компиллятора.

В kotlin есть какой то сахар по усилению проверок на использование null. Вечером посмотрю.

Ну... В scala тоже что то было.

Вобщем если рассматривать java не как яп. А как платформу с семейством языков то защита от NPE имеется.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679510
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronДиез2. null совместим по типу с любым reference-типом по определению, и проверка на null полностью лежит на программисте. С другой стороны String и Optional<String> - это два разных, несовместимых типа, поэтому потребуется явное приведение между ними (просто не получится "забыть" проверить на отсутствие значения)


Помоему логично - если обьекта нет то о типе обьекта не может быть речи.
Глупо рассуждать о типе теста в дырке от бублика.
Но это обстрактно. Покажи на примере что ты имееш в виду.
Нет, не логично. Тип типом, значение значением.

1) В СУБД, практически у любого типа может быть значение NULL. Но (в большинстве случаев) информация про тип при этом сохраняется и все операции допустимые для данного типа - остаются валидны.

Попытка выполнить операции над объектом со значением null - какой-то результат, правда не всегда очевидный,

2) В Java, null это указатель в пустоту. Объекта нет. Никакие операции над объектов не допустимы (((

В Java попытка выполнить операцию над объектом со значением null - Null Pointer Exception.

Вот смотрю доку на Optional, и вижу, что он обеспечивает гарантию выполнения только одной операции - equals(....). Как-то совсем ни о чем ((( Все же другие операции над объектом, как нужно было обрамлять if, так и нужно будет и с Optional.
(синтаксис изменился, но суть то осталась та же. Тот же if который нужно кодировать руками)
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679520
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИнтересно что в c/c++ раньше различали null pointer и wild pointer. Как бы два состояния. Щас наверное зависит от компиллятора.
Да никак.
wild pointer - вещь мне кажется встречающаяся не часто

static (глобальные переменные) и члены класса - всегда по умолчанию инициализируются null'ом. Или в момент старта программы (сегмент данных просто инициализируется нулем) или в дефолтном конструкторе
Pointer'ы в структурах WinAPI - общепризнанный способ из MS документации, изначально заполнять структуру нулями memset'ом.
остаются только локальные переменные ф-ции - но их обычно не много, они долго не живут, программист за ними сам следит

IMHO & AFAIK
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679587
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Боюсь, что задачи обработки null в бд и в яп совершенно разные.
Там кортежи и null полноценная операция.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679624
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevmikronпропущено...


Помоему логично - если обьекта нет то о типе обьекта не может быть речи.
Глупо рассуждать о типе теста в дырке от бублика.
Но это обстрактно. Покажи на примере что ты имееш в виду.
Нет, не логично. Тип типом, значение значением.


Интересно однако.

Вот тут какой тип у переменной cc? И какое значение?
Код: java
1.
      Collection<String> cc = new ArrayList<String>();



А вот тут?
Код: java
1.
      Collection<String> cc = null;
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679647
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

Во всех случаях jvm будет видеть objectref.

Коллекция объектов внутри будет представлена более сложным образом. Зависит от имплементации.

Но сами объекты также будут представлены такими же ссылками.

Впрочем.. Это я нагнетаю. Для старта дискуссии.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679922
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevПочему мы полагаем, что String это строка? Только потому, что разработчики Java заявили, что ponter'ов у них нет, а на самом деле, Object / String это тот же поинтер только "вид сбоку"

С атомарными типами, у нас же такой проблемы нет. Хотя, и в атомарных типах может быть null ))) например Double.NaN, чем не аналог null'а ?

Да. String стоит особняком среди других типов. Хотя-бы потому что ему нет соответствия
среди примитивов.

Double.NaN - это редкое исключение из правил. Это специальная константа которая
обозначает остутствие числа внутри примитива. Но к сожалению мы не сможем
применить это например к целым числам byte/short/int/long.

Сюда-же специальный символ который зарезервирован в С/С++.

Хотя аналогия интересная. Согласен.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679934
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловБгг, не удивительно. До 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
в милисекундах.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679938
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 понаставить.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679940
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679943
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
public interface GeoEntity {

    // Key
    Optional<String> getStartIpNum();
    Optional<String> getEndIpNum();

    // Attribites
    Optional<String> getCountry();
    Optional<String> getRegion();
    Optional<String> getCity();
    Optional<String> getPostalCode();
    Optional<String> getDmaCode();
    Optional<String> getAreaCode();

    Optional<GeoPoint> getGeoPoint();
}



В двух экспериментах я загружал CSV-файл с использованием Apache Commons CSV
и ложил его в Lucene.

За 120 секунд на моём ноутбуке этот файл загружался в БД и индексировался.
Никакой разницы с Optional и без Optional я не обнаружил. Она вобщем-то
была в рамках стат-погрешности. 1-2 секунды. Это время можно не учитывать.
Это по сути случайный шум.

Чисто технически имели место 5 млн * 9 полей = 45 млн. полей аллоцировано
в хипе и освобождено GC.

Размер исходного файла - 450 мб. Размер индекса Lucene - 300 мб.

Для себя пока делаю вывод что Optional не влияет на производительность.
Если кто-то скажет что влияет - welcome. Прошу бенчмарки. С описанием
что и как.

Задача разумеется должна быть осмысленной. Тоесть мерять надо полезную
задачу + Optional а не сферический Optional в вакууме.

Квантовые эффекты нам не нужны.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39679972
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕсли не панацея - то вполне себе решение
подобных вопросов. Safe Calls. Elvis Operator.

https://kotlinlang.org/docs/reference/null-safety.html +1
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39680137
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗадача разумеется должна быть осмысленной. Тоесть мерять надо полезную
задачу + Optional а не сферический Optional в вакууме.


Диалог в рюмочной:
- А скажите, сколько стоит капля Водки?
- Ничего не стоит.
- Хорошо, накапайте мне пожалуста рюмочку.

Это я к чему: На фоне других операций не заметно, но когда зараза расползётся обшая производителность просядет. Только никто не заметит. это как дурной стиль программирования: в отделной операции не заметно, но если пременять глобално то эфект огромный. Скажем на отделном месте из 40 тактов 4 безполезных. значит применяя повсеместнио 10% производителности - просто горячий воздух и вклад к глобальному потеплению.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39680155
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

Надо решать проблемы по мере их поступления. Есть проблема. NPE. Бьет по репутации.

Optional - одно из возможных решений.

От тебя пока не поступило альтернативных пропозиций кроме операции "восклицательный знак" которая не покрывает рантайм.

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

Надо решать проблемы по мере их поступления. Есть проблема. NPE. Бьет по репутации.

Optional - одно из возможных решений.

От тебя пока не поступило альтернативных пропозиций кроме операции "восклицательный знак" которая не покрывает рантайм.

Анекдот про водку - хороший. Но эти метафоры не приближают никакого решения.
Лутче чем решать проблемы - избегать проблемы.
Моё конструктивное предложение: забудьте этот бред смутьянов и не делайте хуже.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39680225
Cheblin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скажем на отделном месте из 40 тактов 4 безполезных. значит...
чувствую что не туда пишу?
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39680944
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton....
Я вот недавно почитал про Котлин. Если не панацея - то вполне себе решение
подобных вопросов. Safe Calls. Elvis Operator.

https://kotlinlang.org/docs/reference/null-safety.html
iMHO Вполне изяшно.
Могли бы и в Java добавить (((
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39680947
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton...Для себя пока делаю вывод что Optional не влияет на производительность....

Мусор в Heap на современных процессорах начинает влиять, когда у нас сервер + несколько клиентов + требуемые совокупный eden за 1-2 Gb перебирается (((

Тогда уже тущите свет. Пауза в GC становится заметной и eden уже не увеличить.

Возможно G1 коллектор спасение. Но когда я с таким стакивался, G1 еще только появлялся.

IMHO & AFAIK
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39680951
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В одно потоковом варианте - мусор живет в eden и никого особо не беспокоит
В много пользовательском выполнение - если eden не хватает, мусор пробирается в Heap. И тут уже начинаются жалобы "Java плохой язык, все тормозит, давайте перепишем приложения на Go".

В 80 % случаев, настройкой памяти тормоза убираются (банально eden выкручиваем на максимум). Но если приложение написано так, что плодит дофига мусора (((( то никакого eden может и не хватить.

IMHO & AFAIK
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39681006
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

что такое eden ?
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39681055
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
См. старое устройство Heap в Java. AFAIK
(в 1.8 поменялось)

young generation:
Eden Space
Survivor Space

old generation:
Tenured Generation

и:
Permanent Generation (non-heap) / Metaspace (java 1.8)
Code Cache (non-heap)
сейчас еще должна быть non-heap под приложение
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39681060
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В G1 garbage collector от этого ушли.
Но я с G1 НЕ работал, ничего сказать не могу.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39681081
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

спасибо, у нас 8я версия, значит, нас не касается
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39681087
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Герой дняLeonid Kudryavtsev,
спасибо, у нас 8я версия, значит, нас не касается

касается не от версии, а от используюемого GC
у меня тоже была 8, но GC использовался старый, т.к. разбираться и эксперементировать с новым не было желания / распоряжения )))
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39681276
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevmayton....
Я вот недавно почитал про Котлин. Если не панацея - то вполне себе решение
подобных вопросов. Safe Calls. Elvis Operator.

https://kotlinlang.org/docs/reference/null-safety.html
iMHO Вполне изяшно.
Могли бы и в Java добавить (((
Хех.. Консерваторы.

Я вот думаю. Допустим мы евангелисты языка. Своего. И владеем мастер репозитарием кода.

Тоесть любую фичу можем вкоммитить.

А теперь вопрос. Какие идеологические причины нам могут помешать? Ну или технические.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39681469
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА теперь вопрос. Какие идеологические причины нам могут помешать? Ну или технические.
Технические - лень
Идеологические - тогда мы будем как Kotlin. Мы же - Java! Самойстийная Java, на всякую фигню из Kotlin не поведется. )))

+Технически - расширить типы постфиксами with null и not null. Это может потребовать менять описания формата class'ов и class loader. Т.е. нужно продумывать решение на обратную совместимость. (например всегда генерировать сразу три class файла, один оригинальный и два синонима/алиаса для with null и not null)

Добавить Kotlin'овские операции, проблем не вижу совершенно. Другое дело, без расширение типов, упремся в субж данного топика ))) Т.к. вводить в спецификацию JRE (как результат операторов) генерики Optional<X> и NotNull<X> - это попахивает жутким костылем граничащим с бредом. (но лямбды тоже достаточно костыльно реализовали, но ведь пользуемся)

На самом деле, т.к. исходники Open JDK и javac доступны - никто не мешает скачать и вхерачить. Вхерачить новый элвис оператор IMHO работы на пару дней )))
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39681486
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevВхерачить новый элвис оператор IMHO работы на пару дней )))
Но

Leonid KudryavtsevТехнические - лень)))
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39682231
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevВ одно потоковом варианте - мусор живет в eden и никого особо не беспокоит
В много пользовательском выполнение - если eden не хватает, мусор пробирается в Heap. И тут уже начинаются жалобы "Java плохой язык, все тормозит, давайте перепишем приложения на Go".

В 80 % случаев, настройкой памяти тормоза убираются (банально eden выкручиваем на максимум). Но если приложение написано так, что плодит дофига мусора (((( то никакого eden может и не хватить.

IMHO & AFAIK
Вы как-то странно термин heap вставили. Как будто не туда.
...
Рейтинг: 0 / 0
Используете вы Optional ?
    #39682413
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да. Надо было old gen . Так же как вместо eden, по логике, young gen.
Расплодили терминов, блин )))
...
Рейтинг: 0 / 0
164 сообщений из 164, показаны все 7 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Используете вы Optional ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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