Похоже, в скором будущем ZGC станет production ready. Появился новый черновик JEP.
Похоже, Nashorn (движок JS) скоро уберут из JDK. Он стал deprecated в Java 11, а теперь его хотят выбросить совсем. Причина очень банальная: никто не изъявил желание его поддерживать.
Таким образом, они хотят убрать единственный движок JS из JDK, и все приложения, использующие JS, перестанут работать. И знаете что? Я даже не удивлюсь, если они реально возьмут и сделают это. Вспомните, например, как просто выкосили Java EE в Java 11. А чем JS лучше?
Таким образом, они хотят убрать единственный движок JS из JDK, и все приложения, использующие JS, перестанут работать. И знаете что? Я даже не удивлюсь, если они реально возьмут и сделают это. Вспомните, например, как просто выкосили Java EE в Java 11. А чем JS лучше?
А вы используете Nashorn или любой другой JavaScript движок в Java (Rhino, Graal.js...)?
Anonymous Poll
14%
Да
86%
Нет
Вчера на конференции SnowOne узнал об очень интересной библиотеке, которая позволяет использовать синтаксис Java 9-14 и компилировать его в Java 8. Библиотека называется Jabel и создана нашим соотечественником Сергеем Егоровым. Поддерживается всё кроме рекордов (их поддержка запланирована на ближайшее будущее). По сути Jabel это агент, который инструментирует пару классов в компиляторе javac и заставляет его "думать", что все фичи выше 9+ относятся к 8-й версии. И всё. Весь код плагина занимает всего около 150 строк! Плагин хорошо работает в Идее. Если ещё включить нужную инспекцию, то можно также обезопасить себя от использования API, которое появилось позже Java 8 (например, StackWalker).
GitHub
GitHub - bsideup/jabel: Jabel - unlock Javac 9+ syntax when targeting Java 8
Jabel - unlock Javac 9+ syntax when targeting Java 8 - bsideup/jabel
Интересный паззлер от Стюарта Маркса
1. Ответ ищите в реплаях.
2. Ещё одна причина не использовать внутренние именованные классы.
1. Ответ ищите в реплаях.
2. Ещё одна причина не использовать внутренние именованные классы.
Twitter
Stuart Marks
BETTER QUIZ: (Fixed typo.) Here's a little Java puzzle I ran across today. What's the fix for this error? class Outer { class Inner { Inner[] array = new Inner[0]; // ^ error: generic array creation } }
Кому-нибудь нужен JetBrains All Products Pack на 3 месяца? Есть лишний купон, не знаю куда деть. Напишите мне, если кому-то нужно.
Купон ушёл
Купон ушёл
Ух ты, срач Баруха и Тагира в Твиттере! К сожалению, не про Java, а про коронавирус 🦠.
Начало
Продолжение
Начало
Продолжение
Twitter
JBaruch 🎩 confused-travolta.gif 🤷♂️
Почему нельзя? Можно. Допускаю мысль, что в России меры по массовому заражению принимаются лучше, чем в Штатах. https://t.co/PBUZPsAsDi
Вот такой канал обнаружил на YouTube. Много всяких видео про Java на русском языке.
YouTube
Project Loom. Асинхронная многопоточность в Java 15
Project Loom: эффективная асинхронная многопоточность в Java 15. Реализация идеи Fibers (файберов) и Continuations (континуаций) - легковесных потоков в Java.
Поддержать проект:
➡ Стать спонсором https://www.youtube.com/letscodedru/join
➡ Patreon https:…
Поддержать проект:
➡ Стать спонсором https://www.youtube.com/letscodedru/join
➡ Patreon https:…
Чёрт, в новом Телеграме статистика канала доступна только для 1000+ подписчиков. А в miniJUG пока только 717. Ну что ж, значит будем расти.
Telegram
Chat Folders, Archive, Channel Stats and More
Many of our users rely on Telegram for their work and studies, even more so in the last weeks. To make sure everyone's chat lists can handle the increased load and you don't miss important messages, we're introducing Chat Folders today.
Плагин для IntelliJ IDEA, который заменяет стандартные иконки для специфичных типов файлов (gradle, git, Travis и т.д.)
JetBrains Marketplace
Extra Icons - IntelliJ IDEs Plugin | Marketplace
Make your IDE more pleasant to use: Adds 500+ icons for files like Travis YML, GitLab YML, Angular files, etc. Many icons have variants, so if you are not happy with...
Итак, в Java 15 ZGC и Shenandoah оба станут production ready. Ваш выбор?
Anonymous Poll
39%
ZGC🤘
61%
Shenandoah 💪
Ещё один интересный плагин для Идеи: Laconic POM. Делает так, чтобы POM-файлы Maven выглядели более компактно.
#maven
#maven
Forwarded from JUGNsk News
Друзья, всем привет!
Из-за пандемии коронавируса мы пока, увы, не можем встречаться офлайн. Но это не значит, что мы не будем проводить наши мероприятия, совсем наоборот!
Конечно же, формат наших встреч немного изменится, но мы уверены, что в этом будут и свои плюсы.
Итак, добро пожаловать на первый онлайн митап JUGNsk!
Он пройдет в пятницу 24.04.2020, в 19-00 по Новосибирскому времени, в Zoom и на Youtube.
Мы решили сразу зайти с козырей, поэтому пригласили стать нашим первым online докладчиком знаменитого Алексея Шипилева! Алексей выступит с докладом: "Shenandoah GC 2.0".
Регистрация на мероприятие и детали: https://www.meetup.com/ru-RU/JUGNsk/events/270056867/
Важно: ограничение на количество участников исключительно для Zoom, одновременно будет доступна трансляция на наш Youtube канал, поэтому можете заранее подписаться, если еще нет: https://www.youtube.com/c/JUGNsk
Из-за пандемии коронавируса мы пока, увы, не можем встречаться офлайн. Но это не значит, что мы не будем проводить наши мероприятия, совсем наоборот!
Конечно же, формат наших встреч немного изменится, но мы уверены, что в этом будут и свои плюсы.
Итак, добро пожаловать на первый онлайн митап JUGNsk!
Он пройдет в пятницу 24.04.2020, в 19-00 по Новосибирскому времени, в Zoom и на Youtube.
Мы решили сразу зайти с козырей, поэтому пригласили стать нашим первым online докладчиком знаменитого Алексея Шипилева! Алексей выступит с докладом: "Shenandoah GC 2.0".
Регистрация на мероприятие и детали: https://www.meetup.com/ru-RU/JUGNsk/events/270056867/
Важно: ограничение на количество участников исключительно для Zoom, одновременно будет доступна трансляция на наш Youtube канал, поэтому можете заранее подписаться, если еще нет: https://www.youtube.com/c/JUGNsk
Meetup
JUGNsk Meetup #14, Fri, Apr 24, 2020, 7:00 PM | Meetup
Fri, Apr 24, 7:00 PM NOVT: Всем привет!
Из-за пандемии коронавируса мы пока, увы, не можем встречаться офлайн. Но это не значит, что мы не будем проводить наши мероприятия, совсем наоборот! Конечно
Из-за пандемии коронавируса мы пока, увы, не можем встречаться офлайн. Но это не значит, что мы не будем проводить наши мероприятия, совсем наоборот! Конечно
Forwarded from javawatch
Для тех, кто всё пропустил и не прошел по ссылке на регистрацию,
Прямо сейчас идет трансляция вот здесь:
https://www.youtube.com/watch?v=Pa_tFjLyW8s
Но в следующий раз регистрируйтесь, пожалуйста, это важно. Да и ссылки прямой может не быть.
Прямо сейчас идет трансляция вот здесь:
https://www.youtube.com/watch?v=Pa_tFjLyW8s
Но в следующий раз регистрируйтесь, пожалуйста, это важно. Да и ссылки прямой может не быть.
YouTube
Разбор доклада Баруха Садогурского «Devops для разработчиков (или против них?!)»
Подробнее о Java-конференциях:
— весной — JPoint: https://jrg.su/gTrwHx
— осенью — Joker: https://jrg.su/h7yvG4
— —
Телеграм-чат для обсуждения: https://news.1rj.ru/str/jug_ru
Впервые в своей истории JUG.ru вышел обеими ногами в онлайн и представил вам новый формат:…
— весной — JPoint: https://jrg.su/gTrwHx
— осенью — Joker: https://jrg.su/h7yvG4
— —
Телеграм-чат для обсуждения: https://news.1rj.ru/str/jug_ru
Впервые в своей истории JUG.ru вышел обеими ногами в онлайн и представил вам новый формат:…
А вы помните, какая команда проверяет версию Java?
Final Results
39%
java -version
29%
java --version
31%
Начиная с Java 9, можно использовать оба варианта. До Java 9 — только первый.
Никогда не используйте Cloneable!
Тут Тагир Валеев написал в Твиттере, что clone() это неплохая штука, если ей правильно пользоваться. Я с этим категорически не согласен. clone() — ужаснейшая вещь. Попробую объяснить почему.
Давайте вспомним, что это вообще такое. Cloneable — наследие с самой первой версии Java. Это интерфейс, который позволяет легко добавлять возможность копирования объектов наших классов. Для этого мы просто наследуем класс от интерфейса Cloneable, и JVM с помощью некоторой магии генерирует нам реализацию метода clone(), которая будет делать копии путём простого копирования полей. При этом сам метод clone является protected методом в классе java.lang.Object, и поэтому доступен для каждого класса, в том числе для тех, кому клонирование нафиг не нужно (это 99% классов).
Здесь можно провести полную аналогию с сериализацией. Если в сериализации есть интерфейс Serializable, который не содержит методов и является интерфейсом-маркером, и при его реализации класс автоматически становится сериализуемым, то в этом случае есть интерфейс Cloneable, который тоже не содержит методов и также является интерфейсом-маркером, и при его реализации класс автоматически становится клонируемым.
Какие проблемы есть у такого механизма клонирования?
Во-первых, это отсутствие статических проверок. Можно забыть отнаследоваться от интерфейса Cloneable и спокойно при этом пользоваться методом clone(). Об ошибке мы узнаем только во время выполнения, когда вылетит CloneNotSupportedException.
Во-вторых, это необходимость downcasting’а при вызове метода clone(). Из-за того, что метод clone() в классе java.lang.Object возвращает Object, нам приходится делать явный cast, чтобы привести его к конкретному типу. Например, если вы вызовете ArrayList.clone(), то вам вернётся Object, а не ArrayList, и вам придётся скастовать к ArrayList. Во времена Java 1.0 это не казалось проблемой, поскольку тогда downcasting был совершенно привычной практикой, но сегодня большинство программистов старается избегать написания подобного нетипобезопасного кода.
В-третьих, так как в большинстве случаев, чтобы нести какую-то пользу, метод clone() должен быть публичным, то нам приходится переопределять метод clone() с одной лишь целью — изменить protected на public! При этом при переопределении метода clone() приходится писать абсолютно бесполезный код, в котором не делается ничего полезного кроме вызова super-метода и перебрасывания CloneNotSupportedException.
И это четвёртая проблема: CloneNotSupportedException является checked-исключением. Checked-исключения — это одна из вещей, от которой я бы тоже с удовольствием избавился в Java. От них вреда намного больше, чем пользы. Можно это как-нибудь позже более подробно обсудить. И если, в том, что, например, IOException является checked-исключением, есть хоть какой-то смысл, то в том, что CloneNotSupportedException сделали checked, смысла нет никакого. Заставлять каждый раз ловить CloneNotSupportedException при вызове clone() — чем думали создатели??
Какое есть решение у вышеперечисленных проблем? Решение простое — просто никогда не использовать Cloneable и метод clone(). Ну разве что за исключением клонирования массивов (это единственное исключение). В остальных случаях, если хочется иметь копирование, можно просто написать свой конструктор копирования или метод копирования, например назвав его copy(). Это будет намного лучше, прозрачнее и безопаснее, чем метод clone(), который создавал бы копию объекта на основе магии и в обход конструктора.
Тут Тагир Валеев написал в Твиттере, что clone() это неплохая штука, если ей правильно пользоваться. Я с этим категорически не согласен. clone() — ужаснейшая вещь. Попробую объяснить почему.
Давайте вспомним, что это вообще такое. Cloneable — наследие с самой первой версии Java. Это интерфейс, который позволяет легко добавлять возможность копирования объектов наших классов. Для этого мы просто наследуем класс от интерфейса Cloneable, и JVM с помощью некоторой магии генерирует нам реализацию метода clone(), которая будет делать копии путём простого копирования полей. При этом сам метод clone является protected методом в классе java.lang.Object, и поэтому доступен для каждого класса, в том числе для тех, кому клонирование нафиг не нужно (это 99% классов).
Здесь можно провести полную аналогию с сериализацией. Если в сериализации есть интерфейс Serializable, который не содержит методов и является интерфейсом-маркером, и при его реализации класс автоматически становится сериализуемым, то в этом случае есть интерфейс Cloneable, который тоже не содержит методов и также является интерфейсом-маркером, и при его реализации класс автоматически становится клонируемым.
Какие проблемы есть у такого механизма клонирования?
Во-первых, это отсутствие статических проверок. Можно забыть отнаследоваться от интерфейса Cloneable и спокойно при этом пользоваться методом clone(). Об ошибке мы узнаем только во время выполнения, когда вылетит CloneNotSupportedException.
Во-вторых, это необходимость downcasting’а при вызове метода clone(). Из-за того, что метод clone() в классе java.lang.Object возвращает Object, нам приходится делать явный cast, чтобы привести его к конкретному типу. Например, если вы вызовете ArrayList.clone(), то вам вернётся Object, а не ArrayList, и вам придётся скастовать к ArrayList. Во времена Java 1.0 это не казалось проблемой, поскольку тогда downcasting был совершенно привычной практикой, но сегодня большинство программистов старается избегать написания подобного нетипобезопасного кода.
В-третьих, так как в большинстве случаев, чтобы нести какую-то пользу, метод clone() должен быть публичным, то нам приходится переопределять метод clone() с одной лишь целью — изменить protected на public! При этом при переопределении метода clone() приходится писать абсолютно бесполезный код, в котором не делается ничего полезного кроме вызова super-метода и перебрасывания CloneNotSupportedException.
И это четвёртая проблема: CloneNotSupportedException является checked-исключением. Checked-исключения — это одна из вещей, от которой я бы тоже с удовольствием избавился в Java. От них вреда намного больше, чем пользы. Можно это как-нибудь позже более подробно обсудить. И если, в том, что, например, IOException является checked-исключением, есть хоть какой-то смысл, то в том, что CloneNotSupportedException сделали checked, смысла нет никакого. Заставлять каждый раз ловить CloneNotSupportedException при вызове clone() — чем думали создатели??
Какое есть решение у вышеперечисленных проблем? Решение простое — просто никогда не использовать Cloneable и метод clone(). Ну разве что за исключением клонирования массивов (это единственное исключение). В остальных случаях, если хочется иметь копирование, можно просто написать свой конструктор копирования или метод копирования, например назвав его copy(). Это будет намного лучше, прозрачнее и безопаснее, чем метод clone(), который создавал бы копию объекта на основе магии и в обход конструктора.
Twitter
Tagir Valeev
I used Cloneable and Object.clone() method in production code and happy about it. That was the best way to solve my problem.