Хочу выяснить, какая самая вредная Java-библиотека. Библиотека, которая постоянно наносит урон разработчикам, усложняет им жизнь, привносит сложность в проекты. Создаёт больше проблем, чем решает. Для этого я создал опрос в Твиттере. Будем выбирать среди 16 библиотек:
• Commons Lang
• Hibernate
• Lombok
• Jackson
• Guava
• slf4j
• Xerces
• Protobuf
• Guice
• log4j
• JUnit
• MyBatis
• JAXB
• Mockito
• Gson
• Commons Collections
16 библиотек разделены на 4 дивизиона. Голосование по первому дивизиону уже закончено, там победил Hibernate. Голосование по второму, третьему и четвёртому дивизиону открыто. У кого есть Твиттер, переходим и голосуем.
Выявим самую ужасную библиотеку! 👺💪
#hibernate #xerces #guice #jaxb #guava
• Commons Lang
• Hibernate
• Lombok
• Jackson
• Guava
• slf4j
• Xerces
• Protobuf
• Guice
• log4j
• JUnit
• MyBatis
• JAXB
• Mockito
• Gson
• Commons Collections
16 библиотек разделены на 4 дивизиона. Голосование по первому дивизиону уже закончено, там победил Hibernate. Голосование по второму, третьему и четвёртому дивизиону открыто. У кого есть Твиттер, переходим и голосуем.
Выявим самую ужасную библиотеку! 👺💪
#hibernate #xerces #guice #jaxb #guava
Начиная с Java 16, компилятор Java будет выдавать предупреждение для неявных конструкторов в публичных классах, экспортированных из модуля. Например, такой код будет подсвечиваться:
#java16
package foo; // exported by module
public class Point {
int x, y;
}
Чтобы избавиться от предупреждения, нужно будет явно объявить конструктор:package foo;
public class Point {
int x, y;
public Point() {
}
}#java16
Вышел новый JEP 389: Foreign Linker API (Incubator). Его цель добавить в Java инструментарий, который является более безопасным, простым и быстрым, чем существующий JNI. Вангую, что первая реализация попадёт в Java 16. Кстати, на эту тему Владимир Иванов делал подробный 2-часовой доклад на JUGNsk. Рекомендую посмотреть, если кто ещё не видел.
#java16 #panama
#java16 #panama
Итак, четыре самых ужасных и вредных Java-библиотеки выбраны. Это Hibernate, Xerces, Guice и JAXB. Теперь нужно выбрать одну. Голосование здесь.
#hibernate #xerces #guice #jaxb
#hibernate #xerces #guice #jaxb
Давайте обсудим результаты.
Меньше всех набрал Guice. ИМХО, эту библиотеку теперь уже просто мало кто использует, потому что почти везде Spring или Java EE, где есть свой dependency injection. Вообще я не очень большой любитель dependency injection через аннотации. Не понимаю, почему нельзя просто использовать статические методы, которые возвращают сервисы. Скажем, есть сервис XYZService и у него есть реализация XYZServiceImpl. Тогда я просто вызывают метод XYZService.get(), который возвращает мне инстанс XYZServiceImpl. Вот и весь dependency injection. Причём работает такой подход всегда, не только в контексте фреймворка.
Xerces. Это одна из тех магических библиотек, которые по-моему никто никогда не использует напрямую, но она присутствует почти в любом проекте. Очень часто она вызывает конфликты в зависимостях и странные ошибки в рантайме вроде NoClassDefFoundError. Вопрос на SO про "Xerces Hell" набрал 739 лайков. Масла в огонь подливает ещё тот факт, что Xerces также присутствует в самом JDK во внутреннем пакете
JAXB — это ещё одна библиотека, которая связана с XML. Больших проблем у пользователей JAXB, насколько я знаю, не было. До тех пор, пока JAXB не решили выпилить из JDK. С этого момента начался адок. Масла в огонь ещё подлил ребрендинг Java EE в Jakarta EE, в рамках которого JAXB переименовали в Jakarta XML Binding. Всё это вызвало проблемы при миграции проектов с Java 8 на последние версии Java.
Теперь про Hibernate, за который проголосовало большинство. Hibernate я использовал много лет назад и относительно недолго. У нас был проект, в котором было огромное количество таблиц (300+), и по моим воспоминаниям Hibernate неплохо так упрощал разработку. Не представляю, как можно было вообще без него обойтись в проекте такого масштаба. Проблемы, конечно, были. Самая главная из них - было очень трудно контролировать производительность SQL-запросов, которые генерировал Hibernate. Когда в запрос вовлечён десяток сущностей с нетривиальными отношениями, то итоговый SQL может быть таким, что без бутылки разобраться, почему он тормозит, почти нереально. В итоге тестеры постоянно жаловались, что вроде бы не очень сложная веб-страница открывается десятки секунд. И в этом то и проблема Hibernate: он слишком просто и быстро позволяет "колбасить" новые сущности. Если вчера вы вроде всё контролировали в своей схеме, то сегодня пришёл джуниор, добавил 5 новых таблиц и 17 новых отношений, навесил аннотаций, и сегодня у вас всё начало тормозить. Hibernate — это слишком мощный инструмент, который нельзя доверять простым смертным. With great power comes great responsibility.
#hibernate #xerces #guice #jaxb
Меньше всех набрал Guice. ИМХО, эту библиотеку теперь уже просто мало кто использует, потому что почти везде Spring или Java EE, где есть свой dependency injection. Вообще я не очень большой любитель dependency injection через аннотации. Не понимаю, почему нельзя просто использовать статические методы, которые возвращают сервисы. Скажем, есть сервис XYZService и у него есть реализация XYZServiceImpl. Тогда я просто вызывают метод XYZService.get(), который возвращает мне инстанс XYZServiceImpl. Вот и весь dependency injection. Причём работает такой подход всегда, не только в контексте фреймворка.
Xerces. Это одна из тех магических библиотек, которые по-моему никто никогда не использует напрямую, но она присутствует почти в любом проекте. Очень часто она вызывает конфликты в зависимостях и странные ошибки в рантайме вроде NoClassDefFoundError. Вопрос на SO про "Xerces Hell" набрал 739 лайков. Масла в огонь подливает ещё тот факт, что Xerces также присутствует в самом JDK во внутреннем пакете
com.sun.org.apache.xerces.internal.jaxp. Посмотрите в свой проект. Если вы видите там xml-apis, xerces, xercesImpl, xmlParserAPIs, то это и есть Xerces, просто в различных своих ипостасях.JAXB — это ещё одна библиотека, которая связана с XML. Больших проблем у пользователей JAXB, насколько я знаю, не было. До тех пор, пока JAXB не решили выпилить из JDK. С этого момента начался адок. Масла в огонь ещё подлил ребрендинг Java EE в Jakarta EE, в рамках которого JAXB переименовали в Jakarta XML Binding. Всё это вызвало проблемы при миграции проектов с Java 8 на последние версии Java.
Теперь про Hibernate, за который проголосовало большинство. Hibernate я использовал много лет назад и относительно недолго. У нас был проект, в котором было огромное количество таблиц (300+), и по моим воспоминаниям Hibernate неплохо так упрощал разработку. Не представляю, как можно было вообще без него обойтись в проекте такого масштаба. Проблемы, конечно, были. Самая главная из них - было очень трудно контролировать производительность SQL-запросов, которые генерировал Hibernate. Когда в запрос вовлечён десяток сущностей с нетривиальными отношениями, то итоговый SQL может быть таким, что без бутылки разобраться, почему он тормозит, почти нереально. В итоге тестеры постоянно жаловались, что вроде бы не очень сложная веб-страница открывается десятки секунд. И в этом то и проблема Hibernate: он слишком просто и быстро позволяет "колбасить" новые сущности. Если вчера вы вроде всё контролировали в своей схеме, то сегодня пришёл джуниор, добавил 5 новых таблиц и 17 новых отношений, навесил аннотаций, и сегодня у вас всё начало тормозить. Hibernate — это слишком мощный инструмент, который нельзя доверять простым смертным. With great power comes great responsibility.
#hibernate #xerces #guice #jaxb
Переход JDK на Git и GitHub официально завершён. Теперь репозиторий открыт для контрибьюторов: можно делать пулл-реквесты.
#skara
#skara
GitHub
GitHub - openjdk/jdk: JDK main-line development https://openjdk.org/projects/jdk
JDK main-line development https://openjdk.org/projects/jdk - GitHub - openjdk/jdk: JDK main-line development https://openjdk.org/projects/jdk
Первый пулл-реквест на GitHub был интегрирован в JDK 16. На странице пулл-реквеста видно, как всё грамотно автоматизировано, и как автор и ревьюер с помощью команд могут управлять процессом. Большая часть работы при этом совершается ботами.
#java16 #skara
#java16 #skara
GitHub
8252715: Problem list java/awt/event/KeyEvent/KeyTyped/CtrlASCII.java on Linux by prrace · Pull Request #23 · openjdk/jdk
Bug :https://bugs.openjdk.java.net/browse/JDK-8252715
We've opened a bug to track some xserver issues running this test that cause all subsequent tests to fail
because they can't c...
We've opened a bug to track some xserver issues running this test that cause all subsequent tests to fail
because they can't c...
microJUG
⚡Shenandoah всё-таки был бэкпортирован в JDK 11! #shenandoah
wiki.openjdk.org
Main
-
Main
-
OpenJDK Wiki
-
Main
-
OpenJDK Wiki
Shenandoah GC Shenandoah is the low pause time garbage collector that reduces GC pause times by performing more garbage collection work concurrently with the running Java program. Shenandoah does the bulk of GC work concurrently, including the concurrent
Будут ли языковые изменения в Java 16?
В Java 16 принципиально новых языковых фич, скорее всего, не будет. Но будут небольшие изменения в существующих.
Во-первых, pattern matching for instanceof станет стабильной фичей (я крайне сомневаюсь, что будет третье превью, хотя на 100% это не исключено). Изменения будут следующими:
• Переменные паттернов не будут неявно final. Это сделает их согласованными с обычными переменными и параметрами методов/лямбд. То есть можно будет написать:
Во-вторых, записи тоже станут стабильной фичей (и тоже третье превью маловероятно). Изменение будет только одно: предлагается разрешить объявлять статические члены во вложенных классах:
#java16 #records
В Java 16 принципиально новых языковых фич, скорее всего, не будет. Но будут небольшие изменения в существующих.
Во-первых, pattern matching for instanceof станет стабильной фичей (я крайне сомневаюсь, что будет третье превью, хотя на 100% это не исключено). Изменения будут следующими:
• Переменные паттернов не будут неявно final. Это сделает их согласованными с обычными переменными и параметрами методов/лямбд. То есть можно будет написать:
if (x instanceof String s) {
s = "abc"; // В Java 15 ошибка компиляции, в 16 - OK
}
• Предлагается запретить делать такие тесты, в которых тип выражения является подклассом типом паттерна. Например:String x = "abc";
if (x instanceof String s) { // ошибка компиляции
...
}
Имхо, это плохое ограничение, и я против его введения (потому что будет несогласованность с обычным instanceof, где так можно делать).Во-вторых, записи тоже станут стабильной фичей (и тоже третье превью маловероятно). Изменение будет только одно: предлагается разрешить объявлять статические члены во вложенных классах:
class A {
class B {
static void foo() { // OK
...
}
}
}#java16 #records
microJUG
Java будет выдавать предупреждения при попытке засинхронизоваться на классах, которые являются кандидатами в inline-типы. Это Integer, Double, Long, Version, Optional, LocalDate, LocalTime, ProcessHandle и другие. Предупреждение будет как во время компиляции…
Value-типы хотят переименовать во второй раз🤦♂️. Теперь это будут не inline-типы, а примитивные типы.
#valhalla
#valhalla
Какой вариант сравнения nullable переменной с константой вы предпочитаете?
Final Results
11%
if (nullable != null && nullable.equals(CONST))
66%
if (CONST.equals(nullable))
22%
if (Objects.equals(nullable, CONST))
1%
Свой вариант (напишу в комментариях)
microJUG
Shenandoah попадёт в JDK 11.0.9. Релиз выйдет 20 октября 2020 года. #shenandoah
Походу, они обосрались, и не включили Shenandoah в AdoptOpenJDK 11.0.9.
P.S. Shenandoah есть в Azul Zulu и, само собой, в редхатовской сборке.
#shenandoah
P.S. Shenandoah есть в Azul Zulu и, само собой, в редхатовской сборке.
#shenandoah