LINUX.ORG.RU

Фичи Java 9, которые могут использовать обычные разработчики

 


2

3

Посоны, я вам покушать принес: ссылка

(создайте кто-нибудь тэг «ежедневное java безумие» или как-то так, ибо таких постов будет еще много? Благодаря Тэйлганнеру я еще нескоро смогу)

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

Тут мы набросали несколько вещей, все же доступных для внешнего наблюдения:
- в интерфейсах теперь можно не просто делать методы, не только статические, но еще и приватные! Авторы воспросов для собеседования «чем абстрактный класс отличается от интерфейса» бьются в истерике
- auto closable переменные в try-with-resources можно объявлять не только внутри try, а где угодно, если они effectively final
- List.of(1, 2, 3); реализация выбирается в зависимости от параметров
- IntStream.range(1, 10).dropWhile(x -> x < 5).forEach(System.out::println)
- Optional.empty().or(() -> Optional.of(«LOR уже не торт»))
- Optional.of(1).stream().map(x -> x * 3); такая мапа будет ленивой
- Optional.empty().ifPresentOrElse(x -> System.out.println(x), () -> System.out.println(«empty»));
- CompletableFuture.clone(); завершение клона не завершает родителя, завершения родителя завершает все слоны
- completableFuture.completeOnTimeout(«нифига, в жабе изобрели таймауты!», 1, TimeUnit.SECONDS)
- StackWalker может бегать по стектрейсам без создания Exception
- нижнее подчеркивание больше нельзя юзать как идентификатор

jshell> ProcessHandle current = ProcessHandle.current();
current ==> 6349

jshell> current.pid()
$33 ==> 6349

jshell> current.info().\TAB
arguments()          command()            commandLine()        equals(              getClass()
hashCode()           notify()             notifyAll()          startInstant()       toString()
totalCpuDuration()   user()               wait(

jshell> current.info().command()
$34 ==> Optional[/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/bin/java]

Как всегда, нужно/ненужно, будете ли вы лепить всё на интерфейсах, и так далее? =)

Перемещено leave из talks

★★★★☆

- нижнее подчеркивание больше нельзя юзать как идентификатор

это они зря, так и доллар запретят, а я в одной DSL поделке юзал метод 'public Clause $(String variableName) {'

Deleted
()

нижнее подчеркивание больше нельзя юзать как идентификатор

rip :(

Rastafarra ★★★★
()
Ответ на: комментарий от Deleted

они в десятке могут запилить опциональные параметры у методов (сейчас вместо подчеркивания можно null, но это не универсально, т.к. примитивы). А в далекой перспективе - еще и паттерн-матчинг

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от stevejobs

они в десятке могут запилить опциональные параметры у методов

_могут_, вот в чем дело. а так они даже runtime доступ к именам аргументов эпически долго рожали

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от stevejobs

они в десятке могут запилить опциональные параметры у методов

Они похапе сделают

nihirash ★★★
()

Угадал автора по заголовку.

lenin386 ★★★★
()

нижнее подчеркивание больше нельзя юзать как идентификатор

Слушком умные нашлись тут. Будут писать два нижних подчёркивания!

iZEN ★★★★★
()

в интерфейсах теперь можно не просто делать методы, не только статические, но еще и приватные! Авторы воспросов для собеседования «чем абстрактный класс отличается от интерфейса» бьются в истерике

По-мне пофиг, я и дефолтными ни разу не пользовался. Разработчикам библиотек наверное не помешает.

- auto closable переменные в try-with-resources можно объявлять не только внутри try, а где угодно, если они effectively final

Нифига не понял, но это try мне в принципе не понравилось. Ну да ладно, пусть будет.

- List.of(1, 2, 3); реализация выбирается в зависимости от параметров

Вообще пофиг, какие-то микроскопические оптимизации.

- IntStream.range(1, 10).dropWhile(x -> x < 5).forEach(System.out::println)
- Optional.empty().or(() -> Optional.of(«LOR уже не торт»))
- Optional.of(1).stream().map(x -> x * 3); такая мапа будет ленивой
- Optional.empty().ifPresentOrElse(x -> System.out.println(x), () -> System.out.println(«empty»));

Ну пусть будет, хаскелистам на забаву. По-мне все эти припарки тупо смотрятся. Их надо было делать изначально. Я как залез в исходники этих стримов, показалось, что перепутал жаву и скалу. Параллельность эта ещё автоматическая, никому не нужная. Проще надо делать, ан е сложней.

- CompletableFuture.clone(); завершение клона не завершает родителя, завершения родителя завершает все слоны
- completableFuture.completeOnTimeout(«нифига, в жабе изобрели таймауты!», 1, TimeUnit.SECONDS)

Это мы не проходили.

- StackWalker может бегать по стектрейсам без создания Exception

Да вроде его несложно было создавать, сомнительное улучшение, ну да ладно.

- нижнее подчеркивание больше нельзя юзать как идентификатор

Это правильно.

jshell> ProcessHandle current = ProcessHandle.current();
current ==> 6349
jshell> current.pid()
$33 ==> 6349

А вот это совсем правильно. Я такое как-то пытался сделать, не осилил. А то висит в диспетчере задач 10 жав и гадай какую надо грохать.

Legioner ★★★★★
()
Ответ на: комментарий от Deleted

в жабе под виндой, убийство процесса нифига не всегда приводило к освобождению ресурсов, например если там запускалась виндовая консолька с батником в параметрах - после смерти процесса консолька оставалась висеть. Чтобы это починить, обычно люди тащат кусок, написанный еще для Hudson, несколько dll собранных подо все платформы (на которых запускается Hudson/Jenkins), которые умеют правильно убивать потомков. Сейчас это говно засунули в сам jdk, можно больше не париться

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от Legioner

а под виндой 8) там да, косячок был, в линуксе просто pid

Deleted
()

Клинопись и маразм с интерфейсами не нужно, остальное вполне годно.

ya-betmen ★★★★★
()
Ответ на: комментарий от foror

эм, как это противоречит? будет десятка, только не через хз сколько, а через год. Или расскажи подробней..

stevejobs ★★★★☆
() автор топика

- нижнее подчеркивание больше нельзя юзать как идентификатор

А как же обратная совместимость?

urxvt ★★★★★
()
Ответ на: комментарий от stevejobs

Да я от скуки сболтнул, дальше статьи в тему не погружался, так что не напрягайся )

foror ★★★★★
()
Ответ на: комментарий от foror

А что с ней не так? JVM похрен на название переменных.

А компилятору? Сейчас можно

String _ = "foo";

и это собираются запретить. Или не так понял нововведение?

urxvt ★★★★★
()

- IntStream.range(1, 10).dropWhile(x -> x < 5).forEach(System.out::println)
- Optional.empty().or(() -> Optional.of(«LOR уже не торт»))
- Optional.of(1).stream().map(x -> x * 3); такая мапа будет ленивой
- Optional.empty().ifPresentOrElse(x -> System.out.println(x), () -> System.out.println(«empty»));


Не нужно. На днях дебажил, искал NPE в чужом псевдофункциональном говнокоде, полном этих опшионалов. Убогая хрень, с null сравнить вообще не проблема никогда.

evilface ★★
()
Ответ на: комментарий от urxvt

да, это для компилятора. в байткоде можно вообще чтобы было

public class class extends extends implements implements
чем и пользуются дерзкие обфускаторы проприетарных произведений искусства.

slyjoeh ★★★
()
Ответ на: комментарий от stevejobs

Ну с этим я согласен - в 9-ке вроде как запуск внешних процессов постабильнее сделан.

Bioreactor ★★★★★
()
Ответ на: комментарий от stevejobs

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

evilface ★★
()
Ответ на: комментарий от stevejobs

и вообще исключений, и сайд эффектов, только они есть, это ява

Deleted
()

нижнее подчеркивание больше нельзя юзать как идентификатор

Капитан Очевидность сообщает, что

_одинарное_ нижнее подчеркивание больше нельзя юзать как идентификатор

error: as of release 9, '_' is a keyword, and may not be used as an identifier

А для особо интересующихся Джавой Капитан Очевидность сообщает, что уже в 8-ой версии было предупреждение

warning: '_' used as an identifier

(use of '_' as an identifier might not be supported in releases after Java SE 8)
Bioreactor ★★★★★
()
Ответ на: комментарий от evilface

для утилит где важна читабельность, например локализация

import static L18n._
//...
button.setCaption(_("Continue"))

именно так я никогда не видел, но выше приводил пример с долларом

Deleted
()
Ответ на: комментарий от Aber

погрепай по сорцам гнутых сишных программ юзающих getetxt, там есть _() именно в таких целях

Deleted
()

хорошо как на С писать и всеми этими ужасами не заморачиваться

Harald ★★★★★
()
Ответ на: комментарий от evilface

Безотносительно совместимости и прочего, зачем так делать в нормальном коде вообще было?

Не знаю, может кто так обозначал неиспользуемые переменные в лямбдах, например. Хотя тут вот товарищ говорит что на это выдают предупреждение в восьмерке, так что вряд-ли.

urxvt ★★★★★
()
Ответ на: комментарий от Deleted

Точно, _(const char *) сам использовал в си для локализации. Но увидя андерскор в качестве имени переменной был сбит с толку.

evilface ★★
()
Ответ на: комментарий от evilface

мутирующих обращений к shared mutable state в функциональном коде быть не должно

если хочешь писать изменить базу, то надо так:
1) первая строчка - достаешь из базы, кладешь в локальную переменную
2) вторая строчка - огромная функциональная лапша, принимающая на вход локал, возвращающая локал
3) третья строчка - пишешь локал в базу

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

все просто, чо нясно)

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от stevejobs

в функциональном коде не должно быть NPE.

бугага ))

ты вот мне расскажи как так может быть:

(null != list && list.size() > 0) --- npe вылетает на size

Rastafarra ★★★★
()
Последнее исправление: Rastafarra (всего исправлений: 1)
Ответ на: комментарий от Rastafarra

у тебя какой-нибудь CopyOnWriteArrayList, которому кто-то сделал setArray(null) (или что-то похожее на махинации с саблистами)?

все сильно зависит от того, что за реализация листа. Например, ArrayList можно как-то поломать многопоточной записью, если там использовался sublist (напрямую или на итераторе), и корень саблиста почему-то стал пустой. Но я в этом не шарю, если копаешь себе могилу - копай активней)

олсо, если сам list доступен для внешней записи, его кто-то мог занулить, поставь перед ним final

олсо, после провеки на null попробуй добавить проверку на isEmpty()

stevejobs ★★★★☆
() автор топика
Последнее исправление: stevejobs (всего исправлений: 3)
Ответ на: комментарий от stevejobs

мутирующих обращений к shared mutable state в функциональном коде быть не должно

если хочешь писать изменить базу, то надо так:
1) первая строчка - достаешь из базы, кладешь в локальную переменную
2) вторая строчка - огромная функциональная лапша, принимающая на вход локал, возвращающая локал
3) третья строчка - пишешь локал в базу

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

все просто, чо нясно)


И зачем было объяснять это мне, если описанное вообще не моё?

evilface ★★
()
Ответ на: комментарий от stevejobs

2) вторая строчка - огромная функциональная лапша, принимающая на вход локал, возвращающая локал

в воображении фантазеров, irl там тонны кода лезущего в базу (зачастую по вычисленному условию) и все это в рамках одной транзакции - что накрывает ваши функциональные идеи медным тазом

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

Тут мы набросали несколько вещей, все же доступных для внешнего наблюдения:
- List.of(1, 2, 3); реализация выбирается в зависимости от параметров
- IntStream.range(1, 10).dropWhile(x -> x < 5).forEach(System.out::println)
- Optional.empty().or(() -> Optional.of(«LOR уже не торт»))
- Optional.of(1).stream().map(x -> x * 3); такая мапа будет ленивой
- Optional.empty().ifPresentOrElse(x -> System.out.println(x), () -> System.out.println(«empty»));

Лавры Scala жабистам спать не дают?

utf8nowhere ★★★
()
Ответ на: комментарий от utf8nowhere

эти фичи были в проекте, когда скала еще только зарождалась. Просто в жаве все фичи делают хорошо и на совесть, поэтому у них инкубационный период не меньше трех лет (а в норме еще больше) =)

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от anonymous_coward

а это не одерский ли хотел пропихнуть пачку улучшений жабы в сан, не пропихнулось - пошел делать скалу и пихать эти улучшения туда?)) (а часть «его» работы сделали через многие годы: JSR-14 «дженерики» точно делал он с еще толпой людей, к JSR-175 «аннотации» он точно прикоснулся, итп). Просто те времена как-то очень фигово гуглятся, т.е. Static Analysis Symposium 2004 и ECOOP 2004 есть вместе с конкретным описанием, а раньше уже совсем печально, а нам нужен 2000-2002 год.

stevejobs ★★★★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.