☕️ 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...
Java
💡 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...
🖥 Java можно учить месяцами - и всё равно бояться написать собственный сервер
🖥 Java можно учить месяцами - и всё равно бояться написать собственный сервер Курс «Java: с нуля до сетевого гуру» построен так, чтобы ты как можно быстрее перешёл от теории к рабочему коду. Сначала разберёшь основы языка, ООП, коллекции и исключения. Затем перейдёшь к тому, ради чего многие и выбирают Java: - многопоточность; - TCP/IP и сокеты; - клиент-серверные приложения; - обработка нескольких подключений; - собственные сетевые проекты. Каждая новая тема закрепляется практикой. Ты будешь...
💡 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> ...
💡 Когда `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...
Java-совет: два разных пути могут вести к одному файлу
Сравнение через Path.equals() проверяет только сами пути. Поэтому эти значения считаются разными: Path path1 = Path.of("data/report.txt"); Path path2 = Path.of("data/../data/report.txt"); Чтобы проверить, указывают ли они на один и тот же реальный файл, используйте: boolean same = Files.isSameFile(path1, path2); Метод учитывает: - относительные и абсолютные пути; - символические ссылки; - особенности файловой системы; - разные способы записи одного расположения...
