microJUG – Telegram
microJUG
981 subscribers
155 photos
1 video
2 files
237 links
Мысли о Java.
Основной канал: @miniJUG
Буст: https://news.1rj.ru/str/microJUG?boost
Чат: https://news.1rj.ru/str/micro_JUG
Таблица JEP'ов: https://minijug.org/jeps.html
Download Telegram
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
Никогда не используйте 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(), который создавал бы копию объекта на основе магии и в обход конструктора.
Ребята, провожу небольшое исследование. Нужно ответить на один вопрос. Как вы работали до и как стали работать после вспышки коронавируса?
Final Results
80%
Работал в офисе, теперь удалённо
10%
Работал удалённо и продолжаю работать удалённо
4%
Работал в офисе и продолжаю работать в офисе
2%
Я стал безработным
5%
Другое
Стабильность, которой позавидует даже Путин
#юмор
Forwarded from Ivan Ugliansky
Всем привет!

Мы закончили обработку видео и теперь публикуем их на нашем youtube-канале: https://www.youtube.com/playlist?list=PLecWId-JT7S6NvsX-8-_FSiwM2XsLoqH3

Простите за задержку с публикацией! Но надеемся, что теперь 13 видео отличных докладов скрасят вам остаток карантина и напомнят о нашем увлекательном последнем дне зимы :) Приятного просмотра!
(В 15-00 по Москве) 👇
Forwarded from JUGNsk News
Друзья, уже совсем скоро, в 19-00 начнется наш первый онлайн митап с Алексеем Шипилёвым!

Вы уже можете заходить в Zoom конференцию, указанную на странице мероприятия на meetup.com (если зарегистрировались), либо начинать смотреть трансляцию на нашем youtube канале: https://www.youtube.com/watch?v=c1jVn5Sm8Uw



Заранее напишу несколько слов про то, как все будет организовано:

1. Алексей выступит с большим докладом из двух частей. Между ними и в самом конце будет время для вопросов и ответов. Вопрос можно задать: 1) в Zoom лично, 2) в нашем чате в телеграме, 3) в чате трансляции на youtube.

2. По умолчанию у участников будут отключены микрофоны, чтобы избежать случайного шума. Если вы хотите задать вопрос, пожалуйста, воспользуйтесь функцией "Поднять руку". Для этого в Zoom на вкладке "Manage Participants"/"Участники" выберите действие "Raise a hand"/"Поднять руку". После этого мы размьютим ваш микрофон.

3. Пожалуйста, включайте камеры! Хоть у нас и онлайн митап, но мы хотим по максимуму воспроизвести атмосферу нашего обычного офлайн митапа. И самое главное: так вы сделаете выступление более комфортным для спикера (кому понравится 2 часа говорить в пустоту?)

4. После основной части будет афтепати :) Все желающие смогут остаться и продолжить общение в свободной форме.

На этом все, ждем вас в 19-00!
Раскрыта правда об отце рэпера Моргенштерна!
#юмор
Марк Рейнолд объявил о новом проекте OpenJDK под кодовым названием Leyden. Цель проекта - уметь создавать из Java-программ самодостаточный статический образ с помощью AOT-компиляции. Похожая технология уже есть в GraalVM под названием Native Image, но она не будет использоваться при разработке.
Biased Locking всё
К сожалению, паттерны деконструкции для записей не появятся в Java 15. Об этом было написано в рассылке, а соответствующая секция была убрана из JEP'а.
Как сказал Gavin Bierman, там есть некоторые сложности с дженериками и varargs, и нужно ещё время, чтобы подумать над дизайном.
Это значит, что в Java 15 изменений в паттерн-матчинге не будет.
Решил составить список русскоязычных Telegram-каналов про Java. Добавил туда те каналы, про которые знаю сам. Но наверняка есть ещё. Если вы знаете, то напишите в комментариях, чтобы я добавил.

P.S. Про чаты писать не нужно, только каналы.
Скинули мне тут пару Telegram-каналов для добавления в список. Спасибо за это. Но я посмотрел на один из них и ужаснулся. Вот такой тест там. Я, будучи абсолютно уверенным, что правильный вариант четвёртый, проголосовал за него. Но правильным ответом по мнению автора должен быть второй. А теперь открываем javadoc к HashMap и читаем:
This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time.
Порядок элементов в HashMap не гарантирован. Точка.
Да, де факто там выделяется массив такой длины, что числа 10, 20 и 30 выстроятся по порядку. Но это деталь реализации. Сегодня она такая, завтра другая. И эта деталь скрыта от нас, чтобы всегда была возможность оптимизировать, не ломая обратную совместимость. А если кто завяжется на порядок, то он рискует, что у него это сломается в какой-нибудь Java 18 или Java 88.
А ведь это Телеграм-канал с 3k подписчиков! Они прочитают это, и кто-то начнёт вызывать new HashMap с initialCapacity, чтобы гарантировать порядок вставки! А те кто поумнее, даже не смогут возразить, потому что это канал и он работает в одну сторону. Как телевизор. Напоминает Первый Канал, который в прайм-тайме на полном серьёзе рассказывает про то, что Билл Гейтс создал коронавирус, чтобы заработать на вакцине.
Кстати, это касается и моего канала. Если вы видите, что я написал откровенный бред, то обязательно напишите мне и укажите на ошибку! Написать мне можно в Твиттере.
Хорошая новость! Sealed Classes & Interfaces попадут в Java 15! Ещё не 100%, но в JEP'е стоит Proposed to Target, а это означает, что почти наверняка.
#sealed
Рон Пресслер (лидер проекта Loom) выложил документ State of Loom. Есть что почитать на выходных.
#loom
К Java 16 OpenJDK полностью переедет на Git и на GitHub (кроме 8u)
#java16 #skara
Тут появилась новость о планах на C# 9.0. В нём появятся записи! Выглядеть будет примерно так:
public data class Person(string FirstName, string LastName);

И ещё много интересного. Например, target types:
Point p = new (3, 5);

Top-level programs:
using System;

Console.WriteLine("Hello World!");

Covariant returns:
abstract class Animal
{
public abstract Food GetFood();
}
class Tiger : Animal
{
public override Meat GetFood() => ...;
}
Удивительно, что эту фичу добавляют так поздно. В Java она присутствует с 1.5!

Конечно прикольно, что нововведений много. Но не кажется ли вам, что в C# с каждым релизом становится всё больше и больше избыточного синтаксического сахара? У меня от C# примерно такие же ощущения, как от Котлина. В обоих языках просто перебор сахара. Как будто сожрал целую банку мёда.
Ушёл писать Notepad драйвер для slf4j... https://twitter.com/nikitonsky/status/1265268383777460224
#юмор