Java Books
описание
Java Библиотека По всем вопросам- @notxxx1 @ai_machinelearning_big_data - machine learning @pythonl - Python @itchannels_telegram - 🔥 best it channels @ArtificialIntelligencedl - AI @pythonlbooks-📚 @programming_books_it -it 📚 № 5032728887
14 251
подписчиков
Охват к подписчикам
13,2%
ERR
Реакции к просмотрам
0,23%
183 на 26 постов
Пересылки к просмотрам
0,53%
417
Постов в день
0,3
всего 27
Где отзываются чаще
доля реакций к просмотрам- 3 авг.Java-совет: два разных пути могут вести к одному файлу Сравнение через Path.equals() проверяет только сами пути. Поэтому эти значения считаются разными: Path path1 = Path.of("data/report.txt"); Path path2 = Path.of("data/../data/report.txt"); Чтобы проверить, указывают ли они на один и тот же реальный файл, используйте: boolean same = Files.isSameFile(path1, path2); Метод учитывает: - относительные и абсолютные пути; - символические ссылки; - особенности файловой системы; - разные способы записи одного расположения. Пример: Path original = Path.of("/app/config.json"); Path symlink = Path.of("/app/current-config"); if (Files.isSameFile(original, symlink)) { System.out.println("Это один файл"); } Важно: метод обращается к файловой системе и может выбросить IOException. Files.isSameFile() полезен перед копированием, перемещением или удалением файлов — особенно когда в проекте используются символические ссылки и нестандартные пути.0,92%
- 6 авг.☕️ Java-совет: не запускайте блокирующий I/O через `CompletableFuture` без собственного пула Такой код выглядит асинхронным: CompletableFuture<User> future = CompletableFuture.supplyAsync(() -> userClient.loadUser(id)); Но без явного Executor задача обычно попадёт в общий ForkJoinPool.commonPool(). Если loadUser() ждёт HTTP, базу данных или файловую систему, поток блокируется. Несколько медленных вызовов могут занять весь общий пул и затормозить совершенно несвязанные операции приложения. Лучше выделить отдельный пул для блокирующего I/O: private static final ExecutorService IO_POOL = Executors.newFixedThreadPool(32); CompletableFuture<User> future = CompletableFuture.supplyAsync( () -> userClient.loadUser(id), IO_POOL ); И не забыть корректно его закрыть: IO_POOL.shutdown(); Для цепочки тоже важно явно выбирать executor: future.thenApplyAsync( user -> enrichUser(user), IO_POOL ); Почему это полезно: - медленный внешний сервис не блокирует общий пул; - нагрузку можно ограничить размером executor; - проще наблюдать очередь и время выполнения; - разные типы задач не мешают друг другу. CompletableFuture не делает блокирующий код неблокирующим. Он лишь переносит ожидание в другой поток. Асинхронность без контроля executor - это просто блокировка в менее заметном месте.0,68%
- 4 авг.💡 Редкий совет Java: используйте `ClassValue` для кэша, привязанного к классу Обычно метаданные кэшируют так: Map<Class<?>, Metadata> cache = new ConcurrentHashMap<>(); Но такой кэш способен удерживать классы и их ClassLoader, создавая утечки памяти в плагинах, серверах приложений и системах с динамической загрузкой. Для подобных случаев в Java есть ClassValue: private static final ClassValue<Metadata> CACHE = new ClassValue<>() { @Override protected Metadata computeValue(Class<?> type) { return inspect(type); } }; Metadata metadata = CACHE.get(User.class); Значение вычисляется отдельно для каждого класса и может быть очищено после его выгрузки. ClassValue особенно полезен для reflection-кэшей, сериализаторов, ORM, прокси и плагинных архитектур. Редкий инструмент JVM, который часто безопаснее, чем ConcurrentHashMap<Class<?>, ...>. #Java #JVM #Backend #Performance0,68%
- 17 июл.Кто-то разобрал Claude Code почти до винтика learn-coding-agent - репозиторий для тех, кто хочет понять, как устроены современные coding agents не на уровне промо-страниц, а на уровне архитектуры. Автор собрал разбор Claude Code по публичным источникам: цикл агента, систему инструментов, разрешения, работу с контекстом, сессии, подпроцессы, MCP, удалённые настройки, телеметрию и скрытые флаги. Получился не “гайд по использованию”, а карта внутренней логики CLI-агента: как он принимает решение, когда просит разрешение, как вызывает инструменты, как хранит историю и как расширяется через внешние интеграции. https://github.com/justxor/Claudecourse/0,43%
- 6 авг.💡 Java совет: два пути могут указывать на один и тот же файл Path.equals() сравнивает только представление пути: Path a = Path.of("data.txt"); Path b = Path.of("./data.txt"); System.out.println(a.equals(b)); // false Хотя оба пути могут вести к одному файлу. Для проверки используйте: boolean same = Files.isSameFile(a, b); Files.isSameFile() обращается к файловой системе и учитывает: - относительные пути; - символические ссылки; - реальное расположение файла. Path file = Path.of("data.txt"); Path link = Path.of("data-link.txt"); Files.isSameFile(file, link); // true, если link ведёт к data.txt Полезно при поиске дубликатов, проверке пользовательских путей и защите от повторной обработки одного файла. Учтите: метод может обращаться к диску и выбрасывать IOException, поэтому это не просто строковое сравнение. Доступно начиная с Java 7. #Java #JavaTips #Files0,43%
- 6 авг.Лето, ИТ-Пикник и музыка известных артистов уже через несколько дней! 8 августа в Коломенском пройдет ИТ-Пикник. В программе — выступления проекта LAB Антона Беляева, IOWA, Cream Soda, Pompeya, мартина и Совы. А днем — научпоп-лекции, дискуссии об ИИ и больших языковых моделях, мастер-классы и интерактивы. Полезные знакомства и развлечения тоже будут. Зарегистрироваться и узнать подробности можно на сайте мероприятия. В билет входит +1 — можно позвать близких и друзей. До встречи в месте притяжения ИТ.0,43%
- 27 июн.🖥 В Java длинные цепочки вроде `user → address → city` легко превращаются в ловушку для `NullPointerException`. Обычный вариант быстро разрастается: User user = userRepository.findByEmail(email); if (user != null) { Address address = user.getAddress(); if (address != null) { return address.getCity(); } } return "unknown"; Проблема не только в количестве строк. В таких вложенных if легко забыть один уровень проверки и получить NPE в самом неожиданном месте. С Optional это можно записать короче и безопаснее: return userRepository.findByEmail(email) .map(User::getAddress) .map(Address::getCity) .orElse("unknown"); Каждый map() выполняется только если предыдущее значение существует. Если пользователя нет, адреса нет или город не задан - цепочка спокойно дойдёт до orElse(). Для таких случаев Optional хорошо работает как способ явно показать: значение может отсутствовать, и это нормальная часть логики. Главное не превращать Optional в новую религию. Он особенно полезен на границах методов и в цепочках, где каждый следующий шаг может вернуть null.0,42%
- 5 авг.💡 Java cj: unmodifiableList() не делает настоящую копию Эти два варианта выглядят похоже, но работают по-разному: List<String> source = new ArrayList<>(); source.add("Java"); List<String> view = Collections.unmodifiableList(source); List<String> copy = List.copyOf(source); source.add("Spring"); System.out.println(view); // [Java, Spring] System.out.println(copy); // [Java] Collections.unmodifiableList() создаёт только неизменяемое представление исходного списка. Если source изменится, изменения появятся и в view. List.copyOf() создаёт отдельный неизменяемый снимок данных. Используйте: - unmodifiableList() — когда нужен read-only view актуального списка; - List.copyOf() — когда нужно зафиксировать состояние и безопасно вернуть его наружу. public List<String> getUsers() { return List.copyOf(users); } Так внешний код не сможет изменить внутреннюю коллекцию, а последующие изменения users не повлияют на уже возвращённый результат. List.copyOf() доступен начиная с Java 10. #Java #JavaTips #Backend0,41%
- 6 авг.Собираем бэкенд-комьюнити на JVM Day Бэкендеры, 29 августа в Москве пройдет хардкорная конференция. Ждут своих: Java-, Scala- и Kotlin-разработчиков, архитекторов и тимлидов. Здесь выступят и расскажут: — Андрей Кулешов — что нового в мире JVM за год. — Сергей Петрелевич — разработка по Mechanical Sympathy. — Александр Ланцов — Java после Loom: другие модели concurrency. — Антон Курако — как бенчмарки вводят в заблуждение. А вечером во дворе T-Space — посиделки, интерактивы и открытый микрофон с историями ошибок. Мест мало, а цена билета будет расти. Успевай зарегистрироваться0,41%
- 2 июл.N+1 в Spring Boot выглядит безобидно, пока прод не начинает молиться на базу данных. Классический сценарий: Вы грузите список заказов: orderRepository.findAll() А потом в цикле обращаетесь к order.getItems(). Hibernate сначала делает один запрос за заказами, а потом ещё по одному запросу на каждый заказ, чтобы достать items. 100 заказов = 101 SQL-запрос. И вот здесь спасает @EntityGraph. Он позволяет явно сказать репозиторию, какие связи нужно подтянуть сразу: @EntityGraph(attributePaths = {"items"}) В итоге Hibernate может сгенерировать один запрос с JOIN, вместо десятков лишних походов в базу. Что получаем: - меньше SQL-запросов - меньше нагрузки на БД - чище код репозитория - без ручного JPQL - fetch-стратегия управляется точечно под конкретный кейс LAZY сам по себе не зло. Зло - когда вы не контролируете, где и как он срабатывает. @EntityGraph - один из самых простых способов держать N+1 под контролем в Spring Boot.0,40%
- 3 авг.Rust, который наконец становится понятным 🦀 Давно хочешь выучить Rust, но ownership, borrowing и lifetimes выглядят как отдельный вид боли? Этот курс проведёт тебя с самого начала до уровня, где ты уже пишешь реальные системные и сетевые программы. Ты разберёшь: Ownership → Borrowing → ошибки → коллекции → Generics → Traits → модули → тесты → сетевой код Никакого бесконечного чтения документации. После каждого урока ты сразу пишешь код, проходишь тесты и решаешь задачу с автопроверкой. 🔥 Rust с нуля 🔥 5–6 часов в неделю 🔥 Практика после каждого урока 🔥 Подойдёт после Python, JavaScript, Java и других языков 🔥 Можно начать сразу В конце у тебя будет понимание Rust, с которым уже можно писать быстрые backend-сервисы, сетевые приложения и системные утилиты, а не смотреть на borrow checker как на врага. Пора добавить Rust в свой стек. Начинай курс и пиши первый код уже сегодня: https://stepik.org/a/294885/0,38%
- 9 июл.💡 Java: делегирование часто безопаснее наследования Наследование кажется удобным, пока суперкласс не начинает жить своей жизнью. Если класс наследуется от родителя, он получает весь его API. Любое изменение сверху может внезапно сломать поведение дочернего класса. С делегированием проще: объект хранит внутри helper/service и передаёт ему нужные вызовы. Плюсы: * меньше жёсткой связности * проще тестировать и мокать * легче менять реализацию * меньше риска сломаться из-за изменений в родителе Правило простое: наследуйтесь только когда связь is-a действительно железная. В остальных случаях чаще лучше композиция и делегирование.0,37%