Библиотека Java разработчика
10.8K subscribers
1.14K photos
564 videos
58 files
1.44K links
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate.


По всем вопросам @evgenycarter

РКН clck.ru/3KoGeP
Download Telegram
ORM — отвратительный анти-паттерн

ORM - это ужасный анти-паттерн, который нарушает все принципы объектно-ориентированного программирования, разбирая объекты на части и превращая их в тупые и пассивные пакеты данных. Нет никаких оправданий существованию ORM в любом приложении, будь то небольшое веб-приложение или система корпоративного размера с тысячами таблиц и манипуляциями CRUD с ними. Какова альтернатива? Объекты, говорящие на языке SQL (SQL-speaking objects).

От автора перевода: Написанный далее текст может не совпадать с мнением автора перевода. Все высказывания идут от лица оригинального автора, просьба воздержаться от неоправданных минусов. Оригинальная статья выпущена в 2014 году, поэтому некоторые фрагменты кода могут быть устаревшими или "нежелаемыми".

original


👉@BookJava
👎14👍10
Зачем нужен package-info?

Обычно, чтобы создать новый пакет, вы создаете папку с соответствующим названием, и во всех ее .java файлах добавляете в начале строчку с названием пакета, вида package full.dir.path;. Этого вполне достаточно для работы.

Однако, дополнительно вы можете добавить в пакет его объявление – файл package-info.java. Несмотря на то, что это .java-файл, это не объявление класса. В названии класса дефисы запрещены, так что неоднозначности не возникнет.

Минимальное содержимое файла package-info.java – всё та же строка package full.dir.path;. Такой файл не несет практической пользы. Есть две вещи, которые можно в него добавить, чтобы польза появилась.

Первое – документация пакета. Javadoc-комментарий будет использоваться генератором документации. Пример – описание пакета java.lang. Его исходник вы можете найти в файле java/lang/package-info.java.

Второе возможное применение – аннотации уровня пакета. Для этого аннотация должна иметь Target PACKAGE. Например, некоторые пакеты Spring Framework помечены аннотацией @NonNullApi.

Подробно объявления пакетов описаны в главе 7.4.1 спецификации.

#jvm

👉@BookJava
👍3🥰1
Подборка каналов для IT специалистов 🎯

https://t.me/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/React_lib Подборки по React js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
https://t.me/frontend_sovet Frontend советы, примеры и практика!


Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++

Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus

Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus

GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub

CodePen 📌
https://t.me/codepen_1 Сообщество пользователей CodePen

Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных

Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка

Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков

Разработка игр 📌
https://t.me/game_devv Все о разработке игр

Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT

Чат программистов📌
https://t.me/developers_ru

Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов

БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning

Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию

QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика

Шутки программистов 📌
https://t.me/itumor Шутки программистов

Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности

Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
https://t.me/arhitekturamira World Architecture

Системное администрирование 📌
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux

Английский 📌
https://t.me/UchuEnglish Английский с нуля

Математика 📌
https://t.me/Pomatematike Канал по математике

Арбитраж трафика 📌
https://t.me/partnerochkin CPA и арбитраж трафика

Крипта 📌
https://t.me/bitkoinoff Новости криптовалют

Метавселенная, GameFi, Crypto 📌
https://t.me/metaverse360

DeepFake 📌
https://t.me/deepfakenow Публикуем deepfake видео

Мир технологий 📌
https://t.me/mir_teh Видео из мира технологий

Excel лайфхак📌
https://t.me/Excel_lifehack
👍6
Какая версия JVM самая быстрая?

Как на высокопроизводительное Java-приложение с низкой задержкой влияет используемая версия JVM? Каждая наносекунда имеет значение для торговых и других приложений, где обмен сообщениями между двумя разными потоками происходит примерно за 250 нс! Прочитайте эту статью и узнайте, какой вариант JDK является лучшим!

#jvm

👉@BookJava
👍5
Ждем всех Java-разработчиков на бесплатном митапе от Росбанка при поддержке JUG Ru Group.

🗓 6 сентября, 19:00.

Онлайн: https://bit.ly/3TiozIc
Офлайн: в деловом центре "Москва-Сити". Участники смогут посетить экскурсию по инновационному офису Росбанка.

В программе:
Алексей Салаев — «Оптимизация запросов с использованием Spring cache и Bean scope»
Семен Киреков — «Spring Data JPA. Save и границы его применения»
Иван Пономарев — «Kafka streams testing: a deep dive»

После каждого доклада вы сможете поучаствовать в дискуссии и задать вопросы спикерам. Автор лучшего вопроса получит удобный рюкзак от Росбанка 🎁

Участие бесплатное, нужно только зарегистрироваться: https://bit.ly/3TiozIc
👍5👎2
Можно ли выбрасывать исключение generic-типа?

Короткий ответ – да. Как в большинстве каверзных вопросов про дженерики, ответ становится очевидным если подумать, во что сотрутся типы-параметры.

Чтобы объявить, что метод выбрасывает исключение обобщенного типа T, этот тип T должен быть объявлен расширяющим Throwable. Именно в Throwable в таком случае сотрется T при компиляции. Также в качестве типа-верхней границы можно использовать любого наследника Throwable:

class MyClass {
void foo() throws T {
// ...
}
}


#Дженерики

👉@BookJava
👍6🔥1
Получите навыки программиста за 7 дней!

Вы погрузитесь в направление «Программирование» от GeekBrains, пройдёте мастер-класс от ведущих специалистов и выберите себе специализацию.

Вас ждут:

– Вводный курс: все, что вам нужно знать на старте про профессию программиста и другие ключевые профессии в IT.

– Мастер-класс по программированию, где вы сможете самостоятельно попрактиковаться в решении задач.

– Эксклюзивные лекции по основам программирования – знания, которые необходимы для любой IT-профессии(

Пройдите анкету после регистрации и получите курсы с платных программ GeekBrains: https://clc.to/5mY5Uw
Шпаргалка по паттернам программирования

👉@BookJava
👍72
Weekend Offer в команду VK Звонков

До 9 сентября VK принимают заявки на участие в оффере для Java-разработчиков, чтобы те стали частью большой команды и помогали развивать один из самых востребованных продуктов ВКонтакте – VK Звонки.

10 сентября тимлиды команды VK Звонков подробно расскажут о задачах, которые вам предстоит решать, а уже 11 сентября, после финальных собеседований,
отправят офферы лучшим кандидатам.

Подать заявку
👍31👎1
Классы BigInteger и BigDecimal

BigInteger и BigDecimalиммутабельные числа с заданной точностью. Эти классы – наследники Number, наряду с обертками примитивных чисел. В классах также реализованы базовые математические операции. Наибольший интерес представляет класс BigDecimal – дробное число.

Числа с плавающей точкой (float, double) хранят свои значения в памяти в экспоненциальном виде: знак-порядок-мантисса. Этот факт приводит к неочевидным с точки зрения десятичной системы округлениям при математических операциях.

BigDecimal хранит число в десятичном виде: немасштабированное значение (intVal), размерность (scale), точность (precision) и знак. Значение раскладывается на эти компоненты как intVal ÷ 10^scale. Точность – количество используемых знаков, без учета нулей в начале, но с учетом нулей в конце. Точность числа 0.0010 – 2.

Экземпляр BigDecimal можно создавать из числа с плавающей точкой, и из строки. В первом случае преобразование из экспоненциального в десятичный вид может привести к неожиданной точности, так что рекомендуется использовать строку.
У класса BigDecimal есть редкая особенность: у него не согласованы методы equals() и compareTo(). equals() сравнивает значения с точки зрения структуры объекта – компоненты точности, размерности и значения сравниваются по отдельности. Так equals на числах 0.1 и 0.10 вернет false – у них разная точность, 1 и 2. compareTo() сравнивает числа с математической точки зрения – на тех же 0.1 и 0.10 compareTo вернет 0.

Вместе с BigDecimal активно используется класс MathContext. Это точность, плюс план действий когда значение в нее не влазит – стратегия округления. MathContext можно передавать как в конструктор, так и в математические операции.

BigInteger можем рассматривать как частный случай BigDecimal. Он используется для целых чисел, больших чем Long.MAX_VALUE.

👉@BookJava
👍6
Алексей Шипилёв - Java-объекты наизнанку

Один из часто задаваемых вопросов об объектах в Java — сколько же они занимают в памяти? В отсутствие языковой или библиотечной операции «sizeof», программистам остаётся гадать о футпринте их кода, или ссылаться на легенды и рассказы специалистов.

В этом докладе мы постараемся заглянуть в изнанку Java-объектов и увидеть, что в них лежит. После этого должны стать ясны многие трюки в футпринте объектов, станут понятны некоторые особенности рантаймов, и будет очевидно, что и как можно эксплуатировать в грязных низкоуровневых целях


https://www.youtube.com/watch?v=3BmznLJAgaA

👉@BookJava
Py4J – мост между Python и Java

Название Py4J можно встретить разве что в списке библиотек, используемых PySpark, но не стоит недооценивать данный инструмент, который обеспечивает совместную работу Python и Java. В этой статье будет кратко описана работа Py4J, рассмотрен пример использования и перечислены сильные и слабые стороны библиотеки. В конце будут описаны альтернативные способы связи Java и Python.

👉@BookJava
👍51
Как применить регулярное выражение в Java?

Регулярные выражения – мощный механизм работы со строками. Здесь мы не будем говорить о регулярных выражениях в целом, поговорим об их использовании в Java. Это становится возможно благодаря пакету java.util.regex стандартной библиотеки.

Работа с регулярными выражениями в Java начинается с класса Pattern. Это представление самого выражения, без привязки к целевому тексту. Создать его можно компиляцией строки, с помощью фабричного метода Pattern.compile(). Паттерн иммутабельный и потокобезопасный.

Matcher – регулярное выражение, примененное к конкретному тексту. Пораждается вызовом метода Pattern.matches(). Одним паттерном можно порождать несколько разных матчеров. В отличие от паттерна, матчер мутирует. Он не безопасен для многопоточной среды. Основные операции регулярных выражений – перебор совпадений, доступ к группам, замена – реализованы именно в этом классе.

Работа с экземпляром Matcher похожа на работу с итератором. Результат метода matches() просто скажет, соответствует ли строка шаблону. Но после его вызова матчер поменяет состояние. Теперь, из него можно получить группы, позицию совпадения в тексте, а также произвести замену.

В объекте шаблона Pattern реализованы несколько методов-сокращений, чтобы не использовать Matcher явно. Например, просто проверить строку на соответствие выражению можно одним методом Pattern.matches().

👉@BookJava
👍6👎1
Что будет выведено на экран?
Что будет выведено на экран?
Anonymous Poll
45%
AB
20%
195
22%
131
10%
Compiler Error
3%
Runtime Error
👍8👎2
Forwarded from Java Geek
Head First Java, 3rd Edition (2022) ePUB
Kathy Sierra, Bert Bates, Trisha Gee

Head First Java is a complete learning experience in Java and object-oriented programming. With this book, you'll learn the Java language with a unique method that goes beyond how-to manuals and helps you become a great programmer. Through puzzles, mysteries, and soul-searching interviews with famous Java objects, you'll quickly get up to speed on Java's fundamentals and advanced topics including lambdas, streams, generics, threading, networking, and the dreaded desktop GUI. If you have experience with another programming language, Head First Java will engage your brain with more modern approaches to coding--the sleeker, faster, and easier to read, write, and maintain Java of today.

Скачать книгу

@java_geek
👍4
Какая разница между абстрактным классом и интерфейсом?

Абстрактный класс:
• абстрактные классы имеют дефолтный конструктор; он вызывается каждый раз, когда создается потомок этого абстрактного класса;
• содержит как абстрактные методы, так и не абстрактные. По большому счету может и не содержать абстрактных методов, но все равно быть абстрактным классом;
• класс, который наследуется от абстрактного, должен реализовать только абстрактные методы;
• абстрактный класс может содержать Instance Variable

Интерфейс:
• не имеет никакого конструктора и не может быть инициализирован;
• только абстрактные методы должны быть добавлены (не считая default methods);
• классы, реализующие интерфейс, должны реализовать все методы (не считая default methods);
• интерфейсы могут содержать только константы.

👉@BookJava
👍14👎1
Какие два класса не наследуются от Object?

Ответ: Не ведитесь на провокации, нет таких классов: все классы прямо или через предков наследуются от класса Object!

👉@BookJava
😁17👍4😱3
Forwarded from Java Geek
Метод split()

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

Параметры:
regex — разграничение регулярного выражения;
limit — порог, результатом которого означает, как много строк, должно быть возвращено.

@java_geek
👍3💩1