tgindex
Java

Самая актуальная информация по Java По всем вопросам- @haarrp @itchannels_telegram - 🔥лучшие каналы @pythonl - 🐍 @ai_machinelearning_big_data- ml @ArtificialIntelligencedl - AI @datascienceiot - ds @pythonlbooks 📚 РКН: clck.ru/3FmwKr #VRHSZ

Последний пост
12:28
Последнее чтение
05:55
Постов за неделю
6
Всего постов
42
Тип
открытый
Язык
русский
Категория
Технологии
В каталоге с
12 авг.
Подписчики
16 762
−23 за 5 дн.
Сутки
0
0,00%
Неделя
 
Месяц
 
Просмотров на пост
1 900
40 постов
Вовлечённость
11,3%
к подписчикам
Постов в день
0,9
всего 42
Упоминаний
6
каналов
Охват размещения
оценка
1/24сутки в ленте
1 204
1/48двое суток
1 379
1/72трое суток
1 488

Оценка по просмотрам недавних постов: пост набирает почти всё за первые сутки.

Посты

  • 12:28855203

    💡 В Java можно избавиться от лишнего cast после instanceof. Старый вариант: if (animal instanceof Dog) { Dog d = (Dog) animal; d.bark(); } С pattern matching переменная объявляется прямо в проверке: if (animal instanceof Dog d) { d.bark(); } d существует только там, где условие instanceof гарантированно истинно. Меньше кода, меньше лишних приведений типов и проще читать. #Java #PatternMatching

  • 14 авг.1 3313118
  • 13 авг.1 465816

    ⚡️ Spring Boot 4: для интеграционных тестов REST лучше переходить с TestRestTemplate на RestTestClient. Почему это удобнее: - fluent API в стиле RestClient; - одинаковый подход для тестов через MockMvc и реальный HTTP-порт; - проще читать цепочки request → response → assertions; - меньше привязки к старому TestRestTemplate. Пример: restTestClient.get() .uri("/api/users/42") .exchange() .expectStatus().isOk() .expectBody(User.class) .value(user -> assertThat(user.id()).isEqualTo(42)); Если автоконфигурация не подтянулась автоматически, добавляем: @AutoConfigureRestTestClient Если начинаете новый проект на Boot 4, TestRestTemplate уже вряд ли стоит выбирать по привычке. #SpringBoot4 #Java #RestTestClient #Testing

  • 13 авг.1 3585

    Вам доклады по Go или Java? VK приглашает на митап с двойной начинкой 26 августа VK собирает Go- и Java-инженеров, чтобы прокачать знания. В программе два трека — Go и Java, по три доклада в каждом. Трек Go: • «Компиляция Go в динамическую либу, или как мы ускорили выкатку фичи в два раза, но нам не понравилось», Михаил Кичигин, бэкенд-разработчик, Avito Tech • «Go-платформа VK: как мы построили единую основу для создания Go-сервисов», Александр Апанасенко, руководитель команды SDK Backend, VK • «Почтальон от Kubernetes до Palo Alto. Как осуществляется доставка информации об адресах», Дарья Кулькина, бэкенд-разработчик, Точка Банк Трек Java: • «Перформанс-трюки в поисковой платформе Ozon», Пётр Портнов, ведущий разработчик среднего поиска, Ozon • «Архитектура современного движка платёжной системы и переход к новой архитектуре», Игорь Крикунов, технический лидер разработки DBC, Альфа-Банк • «Переход от федерации S3-кластеров в пользу коммунального и мультитенантного кластера», Кирилл Боблак, ведущий разработчик One-cloud, VK А ещё будет мастер-класс по прокачке навыка, который сделает вас звездой любого вечера, и афтепати, чтобы обсудить доклады в неформальной обстановке. Встречаемся в 17:00, начало в 18:00. Участие бесплатное, регистрация обязательна.

  • 12 авг.1 341159

    ☕️ Java-совет: `LongAdder` вместо `AtomicLong` для горячих счётчиков Частая ошибка в высоконагруженных системах: private final AtomicLong requests = new AtomicLong(); requests.incrementAndGet(); Проблема: все потоки конкурируют за одну переменную. Много потоков → больше CAS-коллизий → меньше производительность. Для метрик лучше: private final LongAdder requests = new LongAdder(); requests.increment(); Как работает: AtomicLong: Thread 1 ─┐ Thread 2 ─┼──> [100000] Thread 3 ─┘ LongAdder: Thread 1 → [10] Thread 2 → [20] Thread 3 → [15] ↓ sum() LongAdder распределяет обновления между несколькими ячейками памяти, снижая конкуренцию. Идеально для: ✅ Prometheus metrics ✅ счётчиков запросов ✅ статистики JVM ✅ rate limiter Но важно: adder.sum() не гарантирует точный атомарный снимок. Используйте: - LongAdder → метрики и статистика; - AtomicLong → когда нужно точное значение. Одна замена класса может заметно улучшить производительность под нагрузкой. #java #jvm #performance

  • 10 авг.1 78759

    🔥 Ошибка, которую даже Senior Java-разработчики продолжают делать в 2026 году Это чрезмерное использование mutable state и общих изменяемых данных. Результат знаком каждому, кто работал с многопоточностью: - race conditions; - трудноуловимые баги; - лишние synchronized и блокировки; - проблемы с масштабированием. Вместо того чтобы постоянно защищать изменяемое состояние, во многих случаях лучше проектировать код так, чтобы его было меньше изначально: ✅ immutable-объекты ✅ Java record ✅ concurrent-коллекции ✅ immutable snapshots через List.copyOf() ✅ минимум shared state Например, ConcurrentLinkedQueue может убрать необходимость в грубой синхронизации для определённых сценариев, а record отлично подходит для неизменяемых доменных объектов. Главная идея проста: чем меньше состояние можно изменить, тем меньше способов сломать многопоточный Java-код. Но ConcurrentLinkedQueue не универсальная замена synchronized - выбор структуры данных всё равно должен исходить из требований к атомарности и консистентности.

  • 8 авг.2 034514

    ✔️ Spring Boot 4 убрал Undertow - при миграции это легко пропустить Причина простая: Spring Boot 4 перешёл на Servlet 6.1, а Undertow с этой версией Servlet API несовместим. Поэтому из Boot 4 удалили и поддержку embedded Undertow, и spring-boot-starter-undertow. Если раньше было: <artifactId>spring-boot-starter-undertow</artifactId> теперь используйте Tomcat по умолчанию или подключайте Jetty: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> Ещё один важный момент: не разворачивайте Spring Boot 4 в старом Servlet-контейнере — требуется совместимость с Servlet 6.1. Перед миграцией Boot 3 → 4 обязательно проверьте серверную часть приложения. #SpringBoot4 #Java #Servlet

  • 6 авг.2 164914

    ☕️ Java-совет: не кешируйте данные по `Class<?>` через обычный `ConcurrentHashMap` Такой код выглядит нормально: private static final Map<Class<?>, Metadata> CACHE = new ConcurrentHashMap<>(); Metadata metadata = CACHE.computeIfAbsent( type, Metadata::inspect ); Но в приложениях с динамическими ClassLoader такой кеш может удерживать классы в памяти и мешать их выгрузке. Для этого в Java есть малоизвестный ClassValue<T>: private static final ClassValue<Metadata> CACHE = new ClassValue<>() { @Override protected Metadata computeValue(Class<?> type) { return Metadata.inspect(type); } }; Metadata metadata = CACHE.get(User.class); Почему это лучше: - потокобезопасно; - значение вычисляется лениво; - данные хранятся отдельно для каждого класса; - класс и связанное значение могут быть выгружены вместе с ClassLoader. Удалить значение вручную: CACHE.remove(User.class); ClassValue отлично подходит для кеширования reflection-метаданных, сериализаторов, валидаторов и обработчиков аннотаций. Редкий случай, когда встроенный механизм Java и проще, и безопаснее самодельного кеша.

  • 6 авг.1 65431

    Лето, ИТ-Пикник и музыка известных артистов уже через несколько дней! 8 августа в Коломенском пройдет ИТ-Пикник. В программе — выступления проекта LAB Антона Беляева, IOWA, Cream Soda, Pompeya, мартина и Совы. А днем — научпоп-лекции, дискуссии об ИИ и больших языковых моделях, мастер-классы и интерактивы. Полезные знакомства и развлечения тоже будут. Зарегистрироваться и узнать подробности можно на сайте мероприятия. В билет входит +1 — можно позвать близких и друзей. До встречи в месте притяжения ИТ.

  • 6 авг.1 63643

    💡 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 #Files

  • 6 авг.1 52449

    🖥 Java можно учить месяцами - и всё равно бояться написать собственный сервер Курс «Java: с нуля до сетевого гуру» построен так, чтобы ты как можно быстрее перешёл от теории к рабочему коду. Сначала разберёшь основы языка, ООП, коллекции и исключения. Затем перейдёшь к тому, ради чего многие и выбирают Java: - многопоточность; - TCP/IP и сокеты; - клиент-серверные приложения; - обработка нескольких подключений; - собственные сетевые проекты. Каждая новая тема закрепляется практикой. Ты будешь запускать серверы, подключать клиентов, передавать данные и постепенно собирать проекты, которые уже можно показывать в портфолио. Курс подходит новичкам. Никакой подготовки не требуется: обучение начинается с базы и шаг за шагом выводит к задачам реальной backend-разработки. В результате ты получишь крепкую основу Java, поймёшь, как работают сетевые приложения, и перестанешь смотреть на серверный код как на магию. Начни сейчас - и преврати Java из «когда-нибудь выучу» в навык, которым уже можно пользоваться. Курс доступен на Stepik: https://stepik.org/a/295392/

  • 5 авг.1 5821630

    💡 Spring Boot 4: найдите устаревшие настройки до того, как они сломают запуск При миграции на Spring Boot 4 часть старых configuration properties была переименована или удалена. Проверять большие application.yml вручную необязательно — добавьте временный модуль: Gradle: runtimeOnly("org.springframework.boot:spring-boot-properties-migrator") Maven: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-properties-migrator</artifactId> <scope>runtime</scope> </dependency> При запуске приложения migrator: - найдёт устаревшие ключи; - покажет новые названия в логах; - временно подменит свойства во время выполнения. Важный нюанс: модуль не переписывает конфигурационные файлы. Исправьте ключи вручную, снова запустите приложение и удалите зависимость. properties-migrator — это временный помощник для миграции, а не библиотека, которую стоит оставлять в production. #SpringBoot4 #Java #Migration

  • 5 авг.1 78998

    JVM Day 29 августа: новинки JVM мира и –10% на билет   Бэкендеры, отличная новость. 29 августа в Москве пройдет конференция для своих. Приглашают Java-, Scala- и Kotlin-разработчиков, архитекторов и тимлидов.   Здесь выступят и расскажут: — Андрей Кулешов — что нового в JVM за год. — Сергей Петрелевич — разработка по Mechanical Sympathy. — Александр Ланцов — Java после Loom и другие модели concurrency. — Антон Курако — как бенчмарки вводят в заблуждение.   А вечером во дворе T-Space — посиделки, интерактивы и открытый микрофон с историями ошибок. Мест мало, а цена билета будет расти. Успевай зарегистрироваться сегодня со скидкой 10% по промокоду: BYTECODE Промокод действует по 10.08.

  • 4 авг.1 81399

    💡 Когда `ReentrantReadWriteLock` быстрее обычного `synchronized` Если приложение часто читает данные и редко их изменяет, один эксклюзивный lock может стать узким местом. ReentrantReadWriteLock разделяет блокировки: - несколько потоков могут одновременно держать readLock; - writeLock получает исключительный доступ; - во время записи блокируются и читатели, и другие писатели. private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); private final Lock readLock = lock.readLock(); private final Lock writeLock = lock.writeLock(); public String get(String key) { readLock.lock(); try { return cache.get(key); } finally { readLock.unlock(); } } public void put(String key, String value) { writeLock.lock(); try { cache.put(key, value); } finally { writeLock.unlock(); } } Такой подход полезен для кешей, справочников и конфигураций, которые постоянно читаются, но обновляются редко. Однако ReentrantReadWriteLock подходит не всегда. При коротких операциях, высокой конкуренции между писателями или частых обновлениях накладные расходы могут оказаться выше, чем у обычного synchronized или ReentrantLock. Используйте его для read-heavy сценариев и обязательно проверяйте результат под реальной нагрузкой.

  • 4 авг.1 57921

    🔴 Завтра тестовое собеседование с Java-разработчиком 5 августа(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика. Как это будет: 📂 Сергей Чамкин, старший разработчик из Uzum, ex-WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Cергей будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Сергею Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot Реклама. О рекламодателе.

  • 4 авг.1 632107

    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() полезен перед копированием, перемещением или удалением файлов — особенно когда в проекте используются символические ссылки и нестандартные пути.

  • 4 авг.1 787165

    Java 21 становится новой нормой: её уже используют около двух третей разработчиков. Это показали результаты опроса VK и JUG Ru Group, в котором приняли участие более 700 специалистов. При этом Java 8 пока рано списывать — на ней всё ещё работают примерно 16% опрошенных. Современные возможности языка тоже активно входят в практику: Records, Switch Expressions и Text Blocks используют более 70% разработчиков. А 95% уже применяют ИИ в работе.

  • 4 авг.3 9351056

    🔥 JetBrains открыла исходники KotlinLLM - Kotlin-код, который дописывает себя во время выполнения KotlinLLM - исследовательский плагин для IntelliJ IDEA, который позволяет делегировать часть логики приложения LLM прямо во время запуска. Пример: val apiUrl: String = asLlm( "JetBrains/kotlin", hint = "Верни URL для GitHub Issues API" ) val service: GithubService = mockLlm() Когда приложение сталкивается с новым сценарием, плагин: 1. получает runtime-значения и типы; 2. просит LLM сгенерировать обновление; 3. компилирует новый код; 4. горячо перезагружает класс; 5. повторно выполняет исходный вызов. Главная идея - модель не вызывается постоянно. Успешное решение сохраняется как обычный Kotlin-файл, который можно проверить, изменить, закоммитить и запускать дальше уже без LLM. Сейчас доступны два основных механизма: - asLlm<F, T>() - преобразует значение одного типа в другой; - mockLlm<T>() - генерирует реализацию интерфейса и развивает её по мере появления новых сценариев. Пока это исследовательский прототип для Kotlin/JVM. Проект распространяется по лицензии Apache 2.0. GitHub: https://github.com/JetBrains-Research/kotlinllm-plugin @javatg

  • 1 авг.2 50285

    💡 Не используйте `Stream.peek()` для бизнес-логики peek() предназначен в первую очередь для отладки: он выполняет побочное действие внутри цепочки и зависит от терминальной операции. users.stream() .peek(System.out::println) .toList(); Для реальной обработки выбирайте: * map() — преобразовать элементы; * filter() — отфильтровать; * forEach() — явно выполнить действие. Код со скрытыми побочными эффектами сложнее читать, тестировать и поддерживать. #Java #Streams

  • 30 июл.2 69699

    💡 Java-совет: сравнивайте `Instant` с нужной точностью Instant.equals() сравнивает время вплоть до наносекунд, поэтому даже небольшое различие даст false. boolean sameMinute = first.truncatedTo(ChronoUnit.MINUTES) .equals(second.truncatedTo(ChronoUnit.MINUTES)); Так же можно сравнивать значения с точностью до часа или дня: ChronoUnit.HOURS ChronoUnit.DAYS Важно: Instant работает в UTC. Для проверки одного календарного дня в конкретном часовом поясе сначала преобразуйте значения в ZonedDateTime. #Java #JavaTime