Разработка обслуживаемых программ на языке Java
Джуст Виссер
Скачать книгу
Вы когда-нибудь ощущали разочарование, работая с чужим кодом? Сегодня трудности сопровождения исходного кода представляют важную проблему разработки программного обеспечения, приводящую к дорогостоящим срывам сроков и ошибкам. Подключайтесь к ее решению. Данное практическое руководство познакомит вас с 10 простыми рекомендациями, помогающими писать программное обеспечение, которое легко поддерживать и адаптировать. Эти тезисы сформулированы на основании анализа сотен реальных систем.
Написанная консультантами компании Software Improvement Group (SIG), книга содержит ясные и краткие советы по применению рекомендаций на практике. Примеры для этого издания написаны на языке Java, но существует аналогичная книга с примерами на языке C#.
#book #java
Джуст Виссер
Скачать книгу
Вы когда-нибудь ощущали разочарование, работая с чужим кодом? Сегодня трудности сопровождения исходного кода представляют важную проблему разработки программного обеспечения, приводящую к дорогостоящим срывам сроков и ошибкам. Подключайтесь к ее решению. Данное практическое руководство познакомит вас с 10 простыми рекомендациями, помогающими писать программное обеспечение, которое легко поддерживать и адаптировать. Эти тезисы сформулированы на основании анализа сотен реальных систем.
Написанная консультантами компании Software Improvement Group (SIG), книга содержит ясные и краткие советы по применению рекомендаций на практике. Примеры для этого издания написаны на языке Java, но существует аналогичная книга с примерами на языке C#.
#book #java
Самоучитель Java с примерами и программами
А. Васильев
Скачать книгу
Данная книга является превосходным и эффективным учебным пособием для изучения языка программирования Java с нуля. Книга задумывалась, с одной стороны, как пособие для тех, кто самостоятельно изучает язык программирования Java, а с другой, она может восприниматься как лекционный курс с проведением практических занятий. Книга содержит полный набор сведений о синтаксисе и концепции языка Java, необходимый для успешного анализа и составления эффективных программных кодов. Материал книги излагается последовательно и сопровождается большим количеством наглядных примеров, разноплановых практических задач и детальным разбором их решений.
#book #java
А. Васильев
Скачать книгу
Данная книга является превосходным и эффективным учебным пособием для изучения языка программирования Java с нуля. Книга задумывалась, с одной стороны, как пособие для тех, кто самостоятельно изучает язык программирования Java, а с другой, она может восприниматься как лекционный курс с проведением практических занятий. Книга содержит полный набор сведений о синтаксисе и концепции языка Java, необходимый для успешного анализа и составления эффективных программных кодов. Материал книги излагается последовательно и сопровождается большим количеством наглядных примеров, разноплановых практических задач и детальным разбором их решений.
#book #java
Java. Оптимизация программ. Практические методы повышения производительности приложений в JVM
Эванс Бенджамин, Джеймс Гоф, Ньюланд Крис
Скачать книгу
Узнайте, как принципы и технологии Java наилучшим образом используют современные аппаратные средства и операционные системы.
Исследуйте различные тесты производительности и распространенные антипаттерны, которые могут завести вашу команду в тупик.
Изучите ловушки измерений показателей производительности Java и недостатки микротестирования.
Погрузитесь в сборку мусора, протоколирование, мониторинг, настройки и инструменты JVM.
Исследуйте JIT-компиляцию и методы повышения производительности в языке Java.
Изучите аспекты производительности API коллекций и вопросы параллельных вычислений в Java.
#book #java
Эванс Бенджамин, Джеймс Гоф, Ньюланд Крис
Скачать книгу
Узнайте, как принципы и технологии Java наилучшим образом используют современные аппаратные средства и операционные системы.
Исследуйте различные тесты производительности и распространенные антипаттерны, которые могут завести вашу команду в тупик.
Изучите ловушки измерений показателей производительности Java и недостатки микротестирования.
Погрузитесь в сборку мусора, протоколирование, мониторинг, настройки и инструменты JVM.
Исследуйте JIT-компиляцию и методы повышения производительности в языке Java.
Изучите аспекты производительности API коллекций и вопросы параллельных вычислений в Java.
#book #java
Java Concurrency in Practice / Параллельное программирование в JAVA на практике (2018г)
Брайан Готц, Тим Пайерлс, Джошуа Блох, Джозеф Боубир, Дэвид Холмс, Дуг Ли
Скачать книгу
Книга будет полезна в первую очередь для Java разработчиков. Все повествование в книге идет вокруг джавовских примитивов синхронизации и классов, полезных при написании параллельных программ.
Книгу отличает практический подход к изложению, в ней очень много небольших листингов (в среднем около 20 на главу), отражающих все моменты, описываемые в тексте.
#book #java
Брайан Готц, Тим Пайерлс, Джошуа Блох, Джозеф Боубир, Дэвид Холмс, Дуг Ли
Скачать книгу
Книга будет полезна в первую очередь для Java разработчиков. Все повествование в книге идет вокруг джавовских примитивов синхронизации и классов, полезных при написании параллельных программ.
Книгу отличает практический подход к изложению, в ней очень много небольших листингов (в среднем около 20 на главу), отражающих все моменты, описываемые в тексте.
#book #java
Программирование на Java
Нимейер П., Леук Д.
Скачать книгу
Комплексное руководство по освоению языка программирования Java с многочисленными подробными и реалистичными примерами. Если вы - начинающий программист, то книга станет незаменимым помощником для того, чтобы стать профессионалом, а если у вас уже есть опыт работы - вы узнаете о многочисленных тонкостях и разберетесь в самых новых средствах для создания приложений и сервисов. Описаны новинки, появившиеся в Java 8.
#book #java
Нимейер П., Леук Д.
Скачать книгу
Комплексное руководство по освоению языка программирования Java с многочисленными подробными и реалистичными примерами. Если вы - начинающий программист, то книга станет незаменимым помощником для того, чтобы стать профессионалом, а если у вас уже есть опыт работы - вы узнаете о многочисленных тонкостях и разберетесь в самых новых средствах для создания приложений и сервисов. Описаны новинки, появившиеся в Java 8.
#book #java
Forwarded from Академия Кода
Какие типы Java могут имплементировать интерфейсы?
В Java нет концепции множественного наследования, но с помощью интерфейса мы можем его добиться. По сути, интерфейс - это именованный набор определений без реализации. Интерфейс в Java - это особый вид класса. Подобно классам, интерфейс содержит методы и члены; в отличие от классов, в интерфейсе все члены являются окончательными, а все методы абстрактными.
В основном существуют 5 типов Java, которые могут реализовывать интерфейсы:
1. Обычный класс
2. Абстрактный класс
3. Вложенный класс
4. Enum
5. Динамический прокси
Подписывайтесь на канал 👉@coddy_academy
#java
В Java нет концепции множественного наследования, но с помощью интерфейса мы можем его добиться. По сути, интерфейс - это именованный набор определений без реализации. Интерфейс в Java - это особый вид класса. Подобно классам, интерфейс содержит методы и члены; в отличие от классов, в интерфейсе все члены являются окончательными, а все методы абстрактными.
В основном существуют 5 типов Java, которые могут реализовывать интерфейсы:
1. Обычный класс
2. Абстрактный класс
3. Вложенный класс
4. Enum
5. Динамический прокси
Подписывайтесь на канал 👉@coddy_academy
#java
👍1
Forwarded from GitHub Сообщество
Anonymous Messenger – Одноранговый мессенджер, работающий через tor.
Функционал:
• Голосовые сообщения
• Живые голосовые вызовы через tor (альфа-функция)
• Текстовые сообщения
• Медиа-сообщения с удаленными метаданными
• Отправка необработанных файлов любого размера (100 ГБ +)
• Исчезающие сообщения по умолчанию
• Зашифрованное хранилище файлов на Android
• Шифрование по протоколу Диффи-Хеллмана
#GitHub | #Java #Messenger
👉 @Githublib
Функционал:
• Голосовые сообщения
• Живые голосовые вызовы через tor (альфа-функция)
• Текстовые сообщения
• Медиа-сообщения с удаленными метаданными
• Отправка необработанных файлов любого размера (100 ГБ +)
• Исчезающие сообщения по умолчанию
• Зашифрованное хранилище файлов на Android
• Шифрование по протоколу Диффи-Хеллмана
#GitHub | #Java #Messenger
👉 @Githublib
👍8
Forwarded from GitHub Сообщество
MicroG - это свободная реализация проприетарных библиотек Google с открытым исходным кодом, которая заменяет службы Google Play в операционной системе Android.
Грубо говоря, это фреймворк, позволяющий приложениям, предназначенным для Google Play Services, работать в системах, где Play Services недоступны.
#Java #Implementation
👉 @Githublib
Грубо говоря, это фреймворк, позволяющий приложениям, предназначенным для Google Play Services, работать в системах, где Play Services недоступны.
#Java #Implementation
👉 @Githublib
GitHub
GitHub - microg/GmsCore: Free implementation of Play Services
Free implementation of Play Services. Contribute to microg/GmsCore development by creating an account on GitHub.
👍8
Совет по java💡
Обычно при сортировке в
#java
👉 @bookflow
Обычно при сортировке в
Spring Data мы указываем свойство, по которому хотим отсортировать, как строку. Однако существует класс TypedSort, который дает нам возможность передавать функцию в качестве параметра для сортировки. Это повышает безопасность типов в нашем коде.#java
👉 @bookflow
👍5
MicroG - это свободная реализация проприетарных библиотек Google с открытым исходным кодом, которая заменяет службы Google Play в операционной системе Android.
Грубо говоря, это фреймворк, позволяющий приложениям, предназначенным для Google Play Services, работать в системах, где Play Services недоступны.
#Java
👉 @bookflow
Грубо говоря, это фреймворк, позволяющий приложениям, предназначенным для Google Play Services, работать в системах, где Play Services недоступны.
#Java
👉 @bookflow
👍4
Что происходит внутри HashMap.put()?
1. Вычисляется хэш ключа. Если ключ null, хэш считается равным 0. Чтобы достичь лучшего распределения, результат вызова hashCode() «перемешивается»: его старшие биты XOR-ятся на младшие.
2. Значения внутри хэш-таблицы хранятся в специальных структурах данных – нодах, в массиве. Из хэша высчитывается номер бакета – индекс для значения в этом массиве. Полученный хэш обрезается по текущей длине массива. Длина – всегда степень двойки, так что для скорости используется битовая операция &.
3. В бакете ищется нода. В ячейке массива лежит не просто одна нода, а связка всех нод, которые туда попали. Исполнение проходит по этой связке (цепочке или дереву), и ищет ноду с таким же ключом. Ключ сравнивается с имеющимися сначала на ==, затем на equals.
4. Если нода найдена – её значение просто заменяется новым. Работа метода на этом завершается.
5. Если ноды с таким же ключом в бакете пока нет – добавляемая пара ключ-значение запаковывается в новый объект типа Node, и прикрепляется к структуре существующих нод бакета. Ноды составляют структуру за счет того, что в ноде хранится ссылка на следующий элемент (для дерева – следующие элементы). Кроме самой пары и ссылок, чтобы потом не считать заново, записывается и хэш ключа.
6. В случае, когда структурой была цепочка а не дерево, и длина цепочки превысила 7 элементов – происходит процедура treeification – превращение списка в самобалансирующееся дерево. В случае коллизии это ускоряет доступ к элементам на чтение с O(n) до O(log(n)). У comparable-ключей для балансировки используется их естественный порядок. Другие ключи балансируются по порядку имен их классов и значениям identityHashCode-ов. Для маленьких хэш-таблиц (< 64 бакетов) «одеревенение» заменяется увеличением (см. п.8).
7. Если новая нода попала в пустую ячейку, заняла новый бакет – увеличивается счетчик структурных модификаций. Изменение этого счетчика сообщит всем итераторам контейнера, что при следующем обращении они должны выбросить ConcurrentModificationException.
8. Когда количество занятых бакетов массива превысило пороговое (capacity * load factor), внутренний массив увеличивается вдвое, а для всего содержимого выполняется рехэш – все имеющиеся ноды перераспределяются по бакетам по тем же правилам, но уже с учетом нового размера.
#java
👉 @Bookflow
1. Вычисляется хэш ключа. Если ключ null, хэш считается равным 0. Чтобы достичь лучшего распределения, результат вызова hashCode() «перемешивается»: его старшие биты XOR-ятся на младшие.
2. Значения внутри хэш-таблицы хранятся в специальных структурах данных – нодах, в массиве. Из хэша высчитывается номер бакета – индекс для значения в этом массиве. Полученный хэш обрезается по текущей длине массива. Длина – всегда степень двойки, так что для скорости используется битовая операция &.
3. В бакете ищется нода. В ячейке массива лежит не просто одна нода, а связка всех нод, которые туда попали. Исполнение проходит по этой связке (цепочке или дереву), и ищет ноду с таким же ключом. Ключ сравнивается с имеющимися сначала на ==, затем на equals.
4. Если нода найдена – её значение просто заменяется новым. Работа метода на этом завершается.
5. Если ноды с таким же ключом в бакете пока нет – добавляемая пара ключ-значение запаковывается в новый объект типа Node, и прикрепляется к структуре существующих нод бакета. Ноды составляют структуру за счет того, что в ноде хранится ссылка на следующий элемент (для дерева – следующие элементы). Кроме самой пары и ссылок, чтобы потом не считать заново, записывается и хэш ключа.
6. В случае, когда структурой была цепочка а не дерево, и длина цепочки превысила 7 элементов – происходит процедура treeification – превращение списка в самобалансирующееся дерево. В случае коллизии это ускоряет доступ к элементам на чтение с O(n) до O(log(n)). У comparable-ключей для балансировки используется их естественный порядок. Другие ключи балансируются по порядку имен их классов и значениям identityHashCode-ов. Для маленьких хэш-таблиц (< 64 бакетов) «одеревенение» заменяется увеличением (см. п.8).
7. Если новая нода попала в пустую ячейку, заняла новый бакет – увеличивается счетчик структурных модификаций. Изменение этого счетчика сообщит всем итераторам контейнера, что при следующем обращении они должны выбросить ConcurrentModificationException.
8. Когда количество занятых бакетов массива превысило пороговое (capacity * load factor), внутренний массив увеличивается вдвое, а для всего содержимого выполняется рехэш – все имеющиеся ноды перераспределяются по бакетам по тем же правилам, но уже с учетом нового размера.
#java
👉 @Bookflow
👍6❤1
Чем синхронный сервер отличается от асинхронного?
Вопрос может быть сформулирован как «сравните Jetty и Netty», или «зачем нужен Spring WebFlux».
Большинство современных Java web-серверов синхронные. Это значит, что для каждого пришедшего HTTP-запроса выделяется отдельный поток. Даже если такой поток переиспользуется с помощью пула, он остается занятым до конца обработка запроса.
Таким образом, если каждый запрос выполняется одну секунду, то при всего лишь 2000 запросов в секунду сервер расходует 2000 потоков. Потоки в ОС – ограниченный ресурс, и не важно как сконфигурирован ваш сервер – в какой-то момент производительность резко просядет.
Альтернативное решение – асинхронные сервера. В них для потоков обработки HTTP-запросов используется work stealing. В широком смысле, вызовы асинхронных функций не блокируют выполнение, а их результат вместо return value возвращается параметром коллбэка. В Java этот результат зачастую возвращается в виде объекта Future.
Чтобы вся обработка запроса стала действительно асинхронной, необходимо также избавиться от блокирующих операций. Иначе преимущество подхода с work stealing выродится в простой пул потоков. Блокирующая работа с файлами и сетью должна быть заменена на NIO, а для БД должен быть использован асинхронный драйвер.
#Java
👉 @Bookflow
Вопрос может быть сформулирован как «сравните Jetty и Netty», или «зачем нужен Spring WebFlux».
Большинство современных Java web-серверов синхронные. Это значит, что для каждого пришедшего HTTP-запроса выделяется отдельный поток. Даже если такой поток переиспользуется с помощью пула, он остается занятым до конца обработка запроса.
Таким образом, если каждый запрос выполняется одну секунду, то при всего лишь 2000 запросов в секунду сервер расходует 2000 потоков. Потоки в ОС – ограниченный ресурс, и не важно как сконфигурирован ваш сервер – в какой-то момент производительность резко просядет.
Альтернативное решение – асинхронные сервера. В них для потоков обработки HTTP-запросов используется work stealing. В широком смысле, вызовы асинхронных функций не блокируют выполнение, а их результат вместо return value возвращается параметром коллбэка. В Java этот результат зачастую возвращается в виде объекта Future.
Чтобы вся обработка запроса стала действительно асинхронной, необходимо также избавиться от блокирующих операций. Иначе преимущество подхода с work stealing выродится в простой пул потоков. Блокирующая работа с файлами и сетью должна быть заменена на NIO, а для БД должен быть использован асинхронный драйвер.
#Java
👉 @Bookflow
👍5
Совет по Java 💡
С помощью библиотеки Jinq (https://jinq.org) вы можете писать запросы к базам данных, используя потоки Java. Она обеспечивает стиль запросов, схожий с известной библиотекой .NET LINQ. Конечно, вы можете легко интегрировать Jinq с Spring Boot.
#java #jpa #streams
👉 @Bookflow
С помощью библиотеки Jinq (https://jinq.org) вы можете писать запросы к базам данных, используя потоки Java. Она обеспечивает стиль запросов, схожий с известной библиотекой .NET LINQ. Конечно, вы можете легко интегрировать Jinq с Spring Boot.
#java #jpa #streams
👉 @Bookflow
👍4🤔1
📌 Декоратор в Java: Как добавить логику без изменения кода?
🔹 Когда использовать?
- Когда нужно добавить поведение к объекту динамически.
- Когда нельзя или не хочется менять исходный код класса.
- Когда необходимо сохранить принцип открытости/закрытости (OCP из SOLID).
🔹 Как это работает?
Декоратор — это обёртка вокруг базового объекта. Он реализует тот же интерфейс, но внутри может добавлять новую логику.
✅ Пример использования
Допустим, у нас есть базовый интерфейс
И его простая реализация:
Теперь добавим декораторы, которые расширяют функциональность:
1️⃣ Декоратор для отправки в Slack:
2️⃣ Декоратор для отправки в Email:
🚀 Использование:
🔥 Что произойдет?
🎯 Итог:
✅ Мы не изменяли код
✅ Гибкость: можем легко комбинировать декораторы в любом порядке.
✅ Код остаётся чистым и расширяемым.
#java
👉 @Bookflow
🔹 Когда использовать?
- Когда нужно добавить поведение к объекту динамически.
- Когда нельзя или не хочется менять исходный код класса.
- Когда необходимо сохранить принцип открытости/закрытости (OCP из SOLID).
🔹 Как это работает?
Декоратор — это обёртка вокруг базового объекта. Он реализует тот же интерфейс, но внутри может добавлять новую логику.
✅ Пример использования
Допустим, у нас есть базовый интерфейс
Notifier, который отправляет уведомления:
public interface Notifier {
void send(String message);
}
И его простая реализация:
public class BasicNotifier implements Notifier {
@Override
public void send(String message) {
System.out.println("Отправка сообщения: " + message);
}
}
Теперь добавим декораторы, которые расширяют функциональность:
1️⃣ Декоратор для отправки в Slack:
public class SlackNotifierDecorator implements Notifier {
private final Notifier wrapped;
public SlackNotifierDecorator(Notifier wrapped) {
this.wrapped = wrapped;
}
@Override
public void send(String message) {
wrapped.send(message); // вызываем базовый метод
System.out.println("Дополнительно отправляем в Slack: " + message);
}
}
2️⃣ Декоратор для отправки в Email:
public class EmailNotifierDecorator implements Notifier {
private final Notifier wrapped;
public EmailNotifierDecorator(Notifier wrapped) {
this.wrapped = wrapped;
}
@Override
public void send(String message) {
wrapped.send(message);
System.out.println("Дополнительно отправляем Email: " + message);
}
}
🚀 Использование:
public class Main {
public static void main(String[] args) {
Notifier notifier = new BasicNotifier();
notifier = new SlackNotifierDecorator(notifier);
notifier = new EmailNotifierDecorator(notifier);
notifier.send("Привет, мир!");
}
}
🔥 Что произойдет?
Отправка сообщения: Привет, мир!
Дополнительно отправляем в Slack: Привет, мир!
Дополнительно отправляем Email: Привет, мир!
🎯 Итог:
✅ Мы не изменяли код
BasicNotifier, но добавили новую функциональность. ✅ Гибкость: можем легко комбинировать декораторы в любом порядке.
✅ Код остаётся чистым и расширяемым.
#java
👉 @Bookflow
👍5