Вам надо вернуть из функции на Java два результата типа X и Y (например, String и Integer). Какой подход вы выберете?
Final Results
6%
Верну Entry<X, Y>
43%
Верну Pair<X, Y>
20%
Объявлю класс с полями X и Y (без использования Lombok)
27%
Объявлю класс с полями X и Y (с использованием Lombok)
1%
Верну массив Object[] или List<Object> с двумя элементами и потом сделаю downcast
2%
Другой вариант (напишу в комментах)
Ахах, в самой библиотеке Java есть синхронизация на value-based классах.
Это кстати говорит о том, что на коллекциях тоже не надо синхронизоваться, потому что там могут быть любые реализации, в т.ч. value-based.
Это кстати говорит о том, что на коллекциях тоже не надо синхронизоваться, потому что там могут быть любые реализации, в т.ч. value-based.
Недавно проводил опрос про Pair. А кто-нибудь знает про Either и использовали ли когда-нибудь?
Final Results
7%
Использовал в production, но не в Java (Scala, Kotlin и т.п.)
5%
Использовал в production в Java
15%
Я знаю, что такое Either, не использовал, но хотел бы использовать
9%
Я знаю, что такое Either, не использовал и не собираюсь (Either - зло, как и Pair)
65%
Не знаю, что это
В Украине заблокировали GitHub
В перечень подпавших под блокировку доступа сайтов сайт статистики мессенджера Telegram и страница шеринга строк кода на международном IТ-ресурсе GitHub
https://www.interfax.ru/amp/753485
В перечень подпавших под блокировку доступа сайтов сайт статистики мессенджера Telegram и страница шеринга строк кода на международном IТ-ресурсе GitHub
https://www.interfax.ru/amp/753485
Интерфакс
Украинских провайдеров обязали заблокировать РБК и 425 других ресурсов
На Украине Национальная комиссия по госрегулированию в сфере связи и информатизации (НКРСИ) проинформировала провайдеров, что они должны заблокировать доступ к 426 сайтам, среди которых сайт российского РБК, блогосервиса "Живой журнал" (Livejournal.com),…
Накладные расходы по памяти различных коллекций Java
То есть сколько нужно байт, чтобы создать коллекцию из N элементов (в данном случае 10) без учёта размера самих объектов.
Как видно из диаграммы, абсолютными чемпионами по неэффективности являются HashSet, TreeSet и LinkedHashSet. Они обходятся в 4-10 раз (!) дороже, чем эффективные коллекции из левой части. Так что в следующий раз задумайтесь, действительно ли вам нужно использовать именно их.
Из левого списка победителями стали List.of() и ImmutableList. Вот их и надо использовать почаще. Integer[] - для тех, кто экономит каждый байт.
Особняком стоит EnumSet и занимает даже меньше, чем массив. Там если в enum ≤ 64 элементов, то используется простой long для битовой маски.
То есть сколько нужно байт, чтобы создать коллекцию из N элементов (в данном случае 10) без учёта размера самих объектов.
Как видно из диаграммы, абсолютными чемпионами по неэффективности являются HashSet, TreeSet и LinkedHashSet. Они обходятся в 4-10 раз (!) дороже, чем эффективные коллекции из левой части. Так что в следующий раз задумайтесь, действительно ли вам нужно использовать именно их.
Из левого списка победителями стали List.of() и ImmutableList. Вот их и надо использовать почаще. Integer[] - для тех, кто экономит каждый байт.
Особняком стоит EnumSet и занимает даже меньше, чем массив. Там если в enum ≤ 64 элементов, то используется простой long для битовой маски.
Помните Украина заблокировала GitHub? Похоже, теперь эстафету дебилизма приняла Россия.
TJ
Роскомнадзор вместе с твиттером замедлил все сайты с «t.co» в домене, включая RT, Microsoft и GitHub — Новости на TJ
Похоже, «система замедления» ведомства просто перебирает все адреса с определённым сочетанием в домене.
Ну что, вы уже выставили глобальную переменную
JAVA_TOOL_OPTIONS=--illegal-access=permit?Помните недавно я сокрушался про Lombok, который не работает на Java 16? Вчера сразу после выхода Java GA появился патч, который чинит этот баг. Ну как чинит, там опять обходные пути и сплошная грязь 💩. Но давайте по порядку, т.к. там немного нетривиально.
Итак, Lombok использует внутренности модуля jdk.compiler, так как ему для своего функционирования необходимо представление абстрактного синтаксического дерева Java и ещё много чего. Большая часть пакетов jdk.compiler модулем не экспортируется, и начиная с Java 16 доступиться до этих пакетов стало нельзя без использования флагов
1. Метод Module.addOpens() является CallerSensitive, и его может дёрнуть только код из самого модуля jdk.compiler, иначе вылетит IllegalCallerException. Что делать? Если посмотреть на реализацию метода Module.addOpens(), то можно увидеть, что он делегирует работу другому внутреннему методу Module.implAddOpens(), который уже не CallerSensitive. Поэтому давайте будем вызывать его!
2. Но как вызвать внутренний метод, если теперь у нас внутренности JDK закрыты? Method.setAccessible(true) выбросит InacessibleObjectException. Что делать? Давайте попробуем сделать метод accessible через Unsafe! Сделать это можно так: в классе AccessibleObject (от которого отнаследован Method) есть поле boolean override. С помощью Unsafe это поле можно переключить с
3. Но не всё так просто. Чтобы вызвать putBooleanVolatile, нужно передать ему offset этого поля, получить который можно через другой метод Unsafe.objectFieldOffset.
4. Вроде справились? Ещё нет. Чтобы вызвать Unsafe.objectFieldOffset, нужно иметь на руках объект Field для поля override. Но тут вроде всё просто? Получить Field можно просто вызвав
5. Так что же делать? И вот тут самое веселье (такой хак мне ни за что не пришёл бы в голову). Нам ведь нужно просто передать offset поля, а это просто обычный long. Давайте как-нибудь посчитаем, какой offset имеет это поле в объекте Method. Как? Очень просто: объявим где-нибудь на нашей стороне класс с точно такими же полями, как и у Method (и на всякий случай в том же порядке), и найдём offset boolean поля для этого класса! Как тебе такое, Илон Маск? Ну а что: есть два класса с одинаковыми полями – значит JVM должна разложить эти поля по оффсетам в этих двух классах идентично.
Вот такой вот хак. И это даже работает.
А теперь посмотрим ещё раз, какие допущения использовались, и как легко это всё может развалиться:
1. В классе Module внутренний метод, отвечающий за логику открытия пакетов, называется implAddOpens. Если этот метод переименуют, добавят туда параметры или поменяют их порядок, Lombok сломается.
2. Класс AccessibleObject имеет внутреннее boolean поле, которое объявлено первым. Если это поле уберут, на первое место поставят другое поле, JVM начнёт компоновать поля как-нибудь по-другому или вообще логика AccessibleObject как-нибудь совсем поменяется – Lombok сломается.
3. А ещё, что есть Unsafe, который сам может когда-нибудь исчезнуть.
И ещё кстати это всё написано на Java 6, поэтому логика нахождения модулей, которая требует наличие таких классов как Optional, Module, ModuleLayer, реализована полностью через reflection.
#lombok #java16 #unsafe
Итак, Lombok использует внутренности модуля jdk.compiler, так как ему для своего функционирования необходимо представление абстрактного синтаксического дерева Java и ещё много чего. Большая часть пакетов jdk.compiler модулем не экспортируется, и начиная с Java 16 доступиться до этих пакетов стало нельзя без использования флагов
--illegal-access=permit или --add-opens. Можно было бы заставить пользователей руками передавать флаг javac -J--illegal-access=permit или -J--add-opens с перечислением 9 пакетов (com.sun.tools.javac.code, com.sun.tools.javac.comp…), но понятно, что такое решение максимум тянет на временный workaround. Поэтому был выбран другой путь: через reflection дёрнуть метод Module.addOpens(), передав туда наш модуль и имя пакета. Однако возникают следующие проблемы:1. Метод Module.addOpens() является CallerSensitive, и его может дёрнуть только код из самого модуля jdk.compiler, иначе вылетит IllegalCallerException. Что делать? Если посмотреть на реализацию метода Module.addOpens(), то можно увидеть, что он делегирует работу другому внутреннему методу Module.implAddOpens(), который уже не CallerSensitive. Поэтому давайте будем вызывать его!
2. Но как вызвать внутренний метод, если теперь у нас внутренности JDK закрыты? Method.setAccessible(true) выбросит InacessibleObjectException. Что делать? Давайте попробуем сделать метод accessible через Unsafe! Сделать это можно так: в классе AccessibleObject (от которого отнаследован Method) есть поле boolean override. С помощью Unsafe это поле можно переключить с
false на true, используя метод Unsafe.putBooleanVolatile. Давайте так и сделаем.3. Но не всё так просто. Чтобы вызвать putBooleanVolatile, нужно передать ему offset этого поля, получить который можно через другой метод Unsafe.objectFieldOffset.
4. Вроде справились? Ещё нет. Чтобы вызвать Unsafe.objectFieldOffset, нужно иметь на руках объект Field для поля override. Но тут вроде всё просто? Получить Field можно просто вызвав
AccessibleObject.class.getDeclaredField("override"). Однако это не сработает: эту лавочку прикрыли в Java 12 в целях безопасности, и поле override стало невидимым для reflection (чтобы кто попало не мог своими грязными ручонками вот так делать setAccessible, доступаясь до чего угодно: мы видите ли тут всё гайки закручиваем, а эти гады продолжают обходить и обходить).5. Так что же делать? И вот тут самое веселье (такой хак мне ни за что не пришёл бы в голову). Нам ведь нужно просто передать offset поля, а это просто обычный long. Давайте как-нибудь посчитаем, какой offset имеет это поле в объекте Method. Как? Очень просто: объявим где-нибудь на нашей стороне класс с точно такими же полями, как и у Method (и на всякий случай в том же порядке), и найдём offset boolean поля для этого класса! Как тебе такое, Илон Маск? Ну а что: есть два класса с одинаковыми полями – значит JVM должна разложить эти поля по оффсетам в этих двух классах идентично.
Вот такой вот хак. И это даже работает.
А теперь посмотрим ещё раз, какие допущения использовались, и как легко это всё может развалиться:
1. В классе Module внутренний метод, отвечающий за логику открытия пакетов, называется implAddOpens. Если этот метод переименуют, добавят туда параметры или поменяют их порядок, Lombok сломается.
2. Класс AccessibleObject имеет внутреннее boolean поле, которое объявлено первым. Если это поле уберут, на первое место поставят другое поле, JVM начнёт компоновать поля как-нибудь по-другому или вообще логика AccessibleObject как-нибудь совсем поменяется – Lombok сломается.
3. А ещё, что есть Unsafe, который сам может когда-нибудь исчезнуть.
И ещё кстати это всё написано на Java 6, поэтому логика нахождения модулей, которая требует наличие таких классов как Optional, Module, ModuleLayer, реализована полностью через reflection.
#lombok #java16 #unsafe
Почему-то у нас только один Tonsky говорит про UX. Я тоже хочу.
Какой вот, например, сакральный смысл дублировать breadcrumbs в Идее? Причём второй breadcrumb какой-то урезанный, и, ИМХО, бесполезный. Можно убрать этот второй урезанный breadcrumbs и на его место перенести главный. В Eclipse именно так и сделано (второй скрин).
Результат: будет меньше визуальных элементов и будет сэкономлено драгоценное вертикальное пространство (для меня это важно - я работаю на маленьком ультрабуке).
#IntelliJIDEA #Eclipse #UX
Какой вот, например, сакральный смысл дублировать breadcrumbs в Идее? Причём второй breadcrumb какой-то урезанный, и, ИМХО, бесполезный. Можно убрать этот второй урезанный breadcrumbs и на его место перенести главный. В Eclipse именно так и сделано (второй скрин).
Результат: будет меньше визуальных элементов и будет сэкономлено драгоценное вертикальное пространство (для меня это важно - я работаю на маленьком ультрабуке).
#IntelliJIDEA #Eclipse #UX