Как стать автором
Обновить

Комментарии 92

Друзья, внесу немного оффтопика сейчас, т.к. завтра будет поздно. Сегодня (31 августа) — последний день, когда на Joker 2017 всё еще можно купить билеты по вкусной летней стоимости. До конца дня остались считаные часы. Кто хотел определиться — определяйтесь сейчас.

Хорошая статья! на некоторых моментах прям выдохнул) но выбор между интерфейсом и абстрактным классом теперь кажется сложнее, есть ли однозначный ответ, когда что выбирать?
У интерфейса нет и не может быть состояния.
public interface Отрывать {
    AtomicInteger руки = new AtomicInteger(10);
    private static void заТакое() {
        руки.set(11);
    }
}
Ну и это поле будет public static final, то есть состояния у интерфейса всё равно нет.
оно ведь mutable
Ну состояние будет одно на весь classloader, а не на каждый объект, который реализует этот интерфейс.
public interface StateInterface
{
	Map<StateInterface, Integer> states = new IdentityHashMap<>();

	default int getState()
	{
		return states.getOrDefault(this, 0);
	}

	default void setState(int state)
	{
		states.put(this, state);
	}
}
Да, работает. Netbeans думает, что states статический финальный, но реально просто финальный.

Он на самом деле статический.

так и в ногу можно попасть. Даже не особо целясь
в ногу по-моему всегда попадают не целясь в неё))
НЛО прилетело и опубликовало эту надпись здесь
в таких случаях принято комментарий целиком заменять на слово «del», и потом писать в правильное место. Их обычно не минусуют, потому что всем и так ясно, откуда пошла такая фигня
Борис Бритва, или Борис-Хрен-Попадешь, резкий, как удар серпом по яйцам, и жесткий, как удар молотом. Живой советский герб. Говорят, эту сволочь вообще невозможно убить.

www.youtube.com/watch?v=n7itx7O3b_k
Половина или больше этих фич уже есть в Kotlin.

Вот почему-то ничего не пишут, закрыли ли они кучу багов и реквестов по JavaFx.
При чем здесь вообще котлин? Все его фичи тоже уже были в других языках.
При том, что, выходит, изменения в языке / stdlib уже почти не нужны при 100% Java <-> Kotlin interop — если кому нужен сахар, но возьмёт Котлин и будет использовать его. Или любой другой JVM-based язык и компилятор.
Можно было бы сосредоточиться на платформе и hardcore фичах, типа modularity, а не на языке. Тогда бы и апдейты, глядишь, быстрее выходили.

В одном из предыдущих срачей топиков путем докапывания до котлин-адепта выяснилось, что интероп все же совсем не 100%. Также как и у других jvm языков.

Тем кто пишет core-либы смириться и жить на старых возможностях языка? Стоит забить на тех, кому нравится java?
Пришлите ссылку на топик, пожалуйста, если не лень, я бы с удовольствием почитал. Есть, конечно, нюансы, но они достаточно в крайних случаях мешают жить.

Нет, на тех, кому нравится Java, не забить, претензии только к срокам выхода обновлений. Так-то это всё полезные безусловно вещи. Надеюсь, Гёц сотоварищи таки будут продвигать апдейты пошустрее.
Просто те, кому нравится ТОЛЬКО Java, должны понимать, что они вот с такой скоростью будут получать обновления и плюшки. Это, кроме всего прочего, означает, что молодёжь будет изучать другие языки тоже и с бОльшим удовольствием придёт туда, где пишут не только на чистой Java.
>Это, кроме всего прочего, означает, что молодёжь будет изучать другие языки тоже и с бОльшим удовольствием придёт туда, где пишут не только на чистой Java.

Слава богу, хипстеров нам в джаве только еще и не хватало. Пусть на джаваскрипте пишут.
НЛО прилетело и опубликовало эту надпись здесь
:) Киньте ссылок на доказательства обратного, пожалуйста, если есть :)
НЛО прилетело и опубликовало эту надпись здесь
Понятно, спасибо. Пока не пробовал с generics, попробую. Это какая версия была у вас?
НЛО прилетело и опубликовало эту надпись здесь
фигню говорите.
Оракл хотел ввести модульность. Но им не дали говнокодеры, не желающие переписывать свои программы. //Red Hat и IBM
Имхо там слегка сложней.
Есть договоренность, что если спека всеми принята, то ее делают.
А тут получилось, что люди прямо перед выпуском напрямую отказались от своих слов, посчитав их глупостью.
И дело там не только в «переписывать программы», а в том, что изначальную спеку нужно делать куда масштабней и умней.
Обычная мелкая гражданская война, в которой все правы и неправы одновременно, а страдают вообще другие люди :)
Вот почему-то ничего не пишут, закрыли ли они кучу багов и реквестов по JavaFx

По состоянию на 2016 год (если не читали):
static.rainfocus.com/oracle/oow16/sess/1462485593256001c2xn/ppt/JavaFX%209%20-%20New%20and%20Noteworthy.pdf
Java нужна потому, что это Java. Язык с невероятно долгой совместимостью и неформальными гарантиями что новые фичи будут хорошо работать очень долго (может быть, те же фичи будут использовать наши внуки), с хорошо подогнанными друг другу фичами (проходят годы обсуждений, прежде чем какая-то фича попадает на публику), с поддержкой Oracle, ну и в конце концов — это язык, на котором говорит большинство разработчиков в мире. Котлин — хороший язык, но он не об этом. Тем, кому нужна Java, нужна именно Java.
НЛО прилетело и опубликовало эту надпись здесь
java.util.stream.IntStream.range(1, 10).dropWhile(x -> x < 5).forEach(System.out::println)
НЛО прилетело и опубликовало эту надпись здесь
JRE станет еще более параноидальным?
Если Вы о системе модулей, то ДА.
Я о том, что я не Java-программист, а простой админ, и у меня есть горстка не нового, но вполне работоспособного железа, которое управляется через Java-апплеты, и с каждым мажорным релизом их всё сложнее запустить, потому что обновлений к этим железкам уже никто не выпустит, а параноики из Oracle не дают возможности отключить проверки, которые мешают запускать апплеты, и вообще мне не нужны.
Врядли апплеты можно закопать еще глубже, чем их уже закопали, так что нововведения уже совсем не о том.
(хотя я лично скорблю — хороня флеш уже сколько баянов порвали, а такие вкусные апплеты, имхо с меньшими проблемами безопасности, убили прямо в расцвете их сил)

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

эт божественно

Да, поэтому:
1) в конпеляторе есть исследование литералов: http://openjdk.java.net/jeps/186 (это именно исследование, а не финальная спека). Она прям напрямую связана, с обсуждаемой здесь фичей convenience methods (http://openjdk.java.net/jeps/269). Фичу курирует Гёц.
2) уже есть проротипы type values, я писал о них недавно, и буду еще. Фичу курирует Гёц же, и Роуз.


Короче, всё будет, но не мгновенно. Возможно, ускорение релизного цикла, о котором недавно писал Рейнхольт, позволит выкатить подобные mast-have фичи поперед других, более масштабных, изменений, и мы увидим их в ближайшем будущем.

Почему они просто в библиотеку не добавили методы Optional? Зачем ждать новой версии языка?

Это не новая версия языка, это новая версия платформы Java, куда входит и язык, и стандартная библиотека, и тулинг (jshell, например).

К счастью, в Java мире нету апгрейдов стандартной библиотеке в отрыве от выпуска новой версии платформы.
Любое изменение SDK должно быть только в мажорных релизах, иначе будет хаос и про существование стабильности можно будет забыть.

И да, ускорение релизного цикла – это было бы очень круто!
Но с планами по развитию платформы, ускорение релизного цикла, это не такой простой шаг. Зарелизить те же Панаму или Валхаллу – это не так просто будет и скорее всего повлечет откладывания релизов на полгода-год.
Да это жесть просто «ой ребята мы тут лажанулись и теперь видим что там необходимо было два метода добавить чтобы ада избежать, но у нас релизный цикл и сверх надежность, так что вы там держитесь. А в следующей версии мы опять что-то забудем и не дадим вам скучать.» :D

они на полугодовой цикл переходят

Все не так радужно как хотелось бы, но и не так мрачно, как вы описали.

Некоторые фичи обкатываются месяцами перед тем, как попадут в публичный API. Если она не проходит паблик ревью, то ее заворачивают на доработку. Не стоит забывать, что за разработкой и развитием Java/JVM/JDK стоит очень много людей и компаний.

А вот если фича попадает в публичный API, то ее уже оттуда и не вытянуть. Годами будет @deprecated висеть. И что хуже, эту фичу придется поддерживать, чтобы не сломалась и новый функционал нужно делать таким, чтобы не сломал @deprecated :(

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

Я один прочитал как JS hell?

осталось только впилить шугара а ля json и плавающий контекст this

Выглядит и звучит так же, как когда чиновники говорят о прорывах которые в других странах появились уже 10 лет назад.)
Что например мешало добавить удобные методы для создания и манипуляции коллекциями раньше, мне не понятно.

святая заповедь стабильного апи в пределах мажорной версии.

Читайте дискуссии на эту тему в core-libs-dev. Много что мешало.

просто делаешь приватный метод, и он работает. private static тоже.
когда носители ФГМ набигут

уже работает. IntStream.iterate(0, x -> x < 10, x -> x + 1).forEach(System.out::println)

приватные методы в интерфейсах

Ребята, пора уже честно признаться — вам очень не хватало множественного наследования примесей, но вы стесняетесь вводить это бгмерзкое понятие и поэтому распидколбашиваете идеологию интерфейсов.
Интерфейсов, Карл! (запах горелого)
кстати, поправьте меня, если я неправ, но запилить некоторые примочки Optional и .of() можно собственными руками уже в java8
НЛО прилетело и опубликовало эту надпись здесь
Почему не while?
НЛО прилетело и опубликовало эту надпись здесь
Until убили сразу, куда While расти?
Выпиливать — не наш метод.
А вот без Properties, как в C#, до сих пор грустно. Как хорошо, что есть Lombok, правда, IDE его все так же не понимают…
Idea отлично его понимает через свой плагин
Гёц когда-то об этом говорил. Проблема в том, что проперти можно реализовать по-разному, и никакая из реализаций не подойдет всем желающим (включая желающих совместимости для легаси двадцатилетней давности). А маркетинговый эффект этой фичи будет минимальный, по сравнению с приложенными усилиями (т.е. если запилить что-то важное типа лямбд — это скорей будет стимулом поменять $languagename на Java, а вот введение пропертей — не особо)
Зачем они? Только баги провоцируют. Читаешь код и хз что происходит пока все поля не прощелкаешь и не убедишься что это не функции на самом деле.
Idea + lombok plugin = Счастье!
Eclipse тоже понимает, но только после плясок с бубном)

Потому что это джава, а не хипстерский язык, где каждая новая версия может ломать весь существовавший до этого код.

Java, ну когда в тебе уже появится автовывод типов, ну невозможно смотреть на портянки.

В смысле, JEP-286? :) Когда-нибудь относительно скоро

Kotlin вас ждёт
Это стало возможным благодаря появлению статических методов в интерфейсах (Java 8)

Дефолтных?
С удивлением понял, что можно написать вот так:
public interface Main {

    public static void main(String[] args) {
        System.out.println("Hello World!");
    }

}


Или даже вот так:
@SpringBootApplication
@Configuration
public interface TestApplication {
    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(TestApplication.class, args);
    }
}
Было немного неожиданно…
оу, прикольно) не знал про такое

А как там дело с модулями?

List.of(1, 2, 3)

Неожиданно, что это возвращает неизменяемый List. Типичная ситуация в моём коде — создать List или Map с парой элементов, а потом добавить туда ещё несколько. Через List.of это сфейлится в рантайме с Exception-ом. Думаю, многие проограммисты на этом обожгутся.

Как теперь лучше создавать изменяемые списки, вот так?
new ArrayList(List.of(1, 2, 3))

Лучше бы сделали ArrayList.of(1, 2, 3)
Вопрос в том, что стратегический план должен корректировать не только саму форму API, но и способ того, как люди пользуются Java. Направлять мир в правильное русло. Это один из смыслов существования архитектурных советов и выпуска ими рекомендаций. Если бы нужен был просто вспомогательный метод, сделать его не проблема, или уже стащить готовый из Гуавы.

С точки зрения всеобщей схемы всего, верной практикой считается использование иммутабельных конструкций. Нужно всячески поощрять разработчиков к иммутабельности, а стиль программирования — к функциональной чистоте.

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

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

Я не чтобы оракул оракла, это чуть ли не открытым текстом сказано в JEP-269 Convenience Factories.

В дальнейшем эти идеи могут быть развиты с помощью JEP-186 Collection Literals. Предлагается не мусорить с помощью List.of, а сразу писать List list = #[ 1, 2, 3 ];. Но это совершенно отдельный (тоже стратегический) вопрос.
IMHO, иммутабельные конструкции нужны, если для иммутабельных объектов GC поддерживает упрощенную сборку мусора по типу эрланга. А так…
А могли бы вы в двух словах рассказать, что за упрощенная сборка, которая основана на иммутабильности объектов?
Следствием иммутабельности является то, что объект не может ссылаться на объекты, созданные позднее. Соотвественно, граф связей объектов становиться однонаправленным. В результате GC может работать быстрее и эффективнее. А работать ему придется много, поскольку иммутабельность.

Сборка мусора — это деталь реализации, она никак не связана со спецификацией языка. Один и тот же метод стандартной библиотеки, возвращающий неизменяемую коллекцию, может выполняться на разных JVM с разными сборщиками мусора. Никто вам также не мешает форкнуть OpenJDK и написать свой сборщик мусора. Почему реализация стандартной библиотеки должна оглядываться на сборщики мусора?

Думаю, не будет Collection literals. По крайней мере, не в ближайшие годы.

А если мутабельный список, потокобезопасный он или нет? А добавление в начало или в середину дешёвое или нет? Реализаций списков много. А с Set и Map ещё хуже. Сохраняет ли порядок, сортирует ли ключи. Например, в JavaScript объекты сохраняют порядок вставки, а это дополнительные ненужные накладные расходы в 99% случаев. Сериализуемость, потокобезопасность. Можно ли в Java 9 сериализовать List.of(x) и десериализовать его потом в Java 8, получив аналог Collections.singletonList(x)? Много, много интересных вопросов влечёт такая фича. Это всё на тему того, почему 10 лет назад не сделали.


ArrayList.of(1,2,3) обсуждался, но он перекрывает List.of(1,2,3), а это нехорошо, когда один статический метод перекрывает другой, меняя семантику. Опять же привет старому поспешному дизайнерскому решению, что статический метод можно вызывать, используя подкласс в качестве квалификатора. Напишите вы class MySuperList extends ArrayList implements List, и что будет значить MySuperList.of(1,2,3)?

Ладно со списками, особенно красиво выглядит Set.of(), возвращающий иммутабельное множество, и
EnumSet.of(), возвращающий мутабельное
Тут уже пошутили про андроид?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий