
- Главная
- Каталог
- Интернет технологии
- Java | Фишки и трюки
Java | Фишки и трюки
Аудитория канала - начинающие или опытные Java программисты. Канал о разработке приложений на Java, в том числе написание бэкенд и web-приложений. Рассматриваются фишки и трюки при программировании на Java.
Статистика канала
null
Возвращение пустых коллекций вместо null-это рекомендуемый подход для методов, возвращающих коллекции. Он упрощает обработку данных, предотвращает ошибки и делает код более предсказуемым.
public class CacheService {
private final Map<String, List<Object>> cache = new ConcurrentHashMap<>();
public List<Object> getCachedValues(String key) {
return cache.getOrDefault(key, Collections.emptyList());
}
public void addToCache(String key, Object value) {
cache.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
}
}{}
<?>
В Java <?> называется неограниченным wildcard. Он обозначает, что параметр типа может быть любым, то есть неизвестным на этапе компиляции. Это удобно, когда метод или класс работают с обобщёнными типами, но конкретный тип элемента не важен.
Например, выражение List<?> означает список, элементы которого могут быть любого типа. Такой подход позволяет писать более универсальный и гибкий код, но при этом накладывает ограничения: мы не можем добавлять новые элементы в коллекцию, поскольку компилятор не знает конкретный тип элементов, чтобы обеспечить безопасность типов.
import java.util.List;
public class WildcardExample {
public static void printList(List<?> list) {
for (Object element : list) { // Элементы можно читать как Object
System.out.println(element);
}
}
public static void main(String[] args) {
List<Integer> intList = List.of(1, 2, 3);
List<String> strList = List.of("A", "B", "C");
printList(intList); // Вывод: 1 2 3
printList(strList); // Вывод: A B C
}
}{}
Здесь List<?> позволяет передавать любой тип списка, но мы можем безопасно читать только как Object.
public static void addElement(List<?> list) {
// list.add("Hello"); // Ошибка компиляции!
}{}
#java #wildcardequals() и hashCode(). Ошибся и HashMap или HashSet начинают вести себя "магически" (читай: ломаются).
📦 Проблема на практике
Set<User> users = new HashSet<>();
users.add(new User("Alex"));
System.out.println(users.contains(new User("Alex"))); // ❌ false{}
🤨 Почему false, если значения одинаковые?
⚠️ Причина
По умолчанию equals() сравнивает ссылки (==), а не содержимое.
✅ Правильная реализация
public class User {
private String name;
// equals
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
User user = (User) o;
return Objects.equals(name, user.name);
}
// hashCode
@Override
public int hashCode() {
return Objects.hash(name);
}
}{}
🔥 Почему важны ОБА метода?
Если переопределить только equals():
users.add(new User("Alex"));
users.contains(new User("Alex")); // ❌ всё ещё может быть false{}
👉 Потому что HashSet сначала смотрит на hashCode(), а потом уже на equals().
⚡ Контракт, который нельзя нарушать
1. Если equals() возвращает true → hashCode() обязан быть одинаковым
2. Если hashCode() одинаковый → equals() может быть как true, так и false
💣 Классическая ошибка
Изменяем объект после добавления в HashSet:
User user = new User("Alex");
users.add(user);
user.setName("Bob");
users.contains(user); // ❌ может вернуть false{}
👉 Объект "потерялся" в коллекции
🧠 Как избежать проблем
* Делай объекты immutable (final поля)
* Используй record (Java 16+):
public record User(String name) {}{}
👉 equals() и hashCode() генерируются автоматически и корректно
📌 Вывод
Коллекции в Java работают быстро благодаря hashCode(),
но требуют строгого соблюдения контракта.
Нарушишь - получишь баги, которые очень сложно отловить 🐛Supplier. Это может сильно упростить код и улучшить производительность.
📦 Что такое `Supplier`?
Это функциональный интерфейс из java.util.function, который просто возвращает значение:
Supplier<String> supplier = () -> "Hello";
System.out.println(supplier.get());{}
Но магия начинается, когда используешь его правильно 👇
🔥 Кейс: дорогое вычисление
public String getData() {
System.out.println("Loading...");
return "data";
}{}
Теперь сравни:
❌ Обычный вызов:
String result = getData(); // всегда выполняется{}
✅ Ленивый вызов:
Supplier<String> supplier = this::getData;
// вызов произойдёт только здесь
String result = supplier.get();{}
👉 Код выполняется только когда реально нужен результат.
⚡ Практическое применение: логирование
logger.debug("Result: " + expensiveOperation());{}
❗ Даже если debug выключен — expensiveOperation() всё равно выполнится.
✅ Правильно:
logger.debug(() -> "Result: " + expensiveOperation());{}
👉 Вычисление произойдёт только если лог реально пишется.
🧠 Комбинация с `Optional`
String name = Optional.ofNullable(getName())
.orElseGet(() -> generateDefaultName());{}
👉 generateDefaultName() вызовется только если значение отсутствует
(в отличие от orElse, который выполняется всегда)
🚀 Паттерн: кэширование (lazy cache)
Supplier<String> cached = new Supplier<>() {
private String value;
@Override
public String get() {
if (value == null) {
value = loadExpensiveData();
}
return value;
}
};{}
👉 Получаешь простую ленивую инициализацию без лишних библиотек
📌 Вывод
Supplier — это не просто "лямбда ради лямбды", а инструмент для:
* ленивых вычислений
* оптимизации
* более чистого API
spring:
cloud:
config:
server:
git:
uri: https://github.com/your-repo/config-repo{}
Пример настройки Config Client:
spring:
cloud:
config:
uri: http://localhost:8888
profile: dev{}
Преимущества: упрощает управление конфигурациями, поддерживает разные среды, позволяет динамически обновлять настройки.
Недостатки: важен контроль за доступом и стабильностью Config Server.
#java #Spring #Cloud #Config== и .equals()?
При сравнении объектов в Java важно понимать различие между == и .equals().
✔️ == сравнивает ссылки на объекты, проверяя, указывают ли они на одну и ту же область памяти.
✔️ .equals() используется для сравнения содержимого объектов, если метод переопределен.
Пример:
String a = new String("Java");
String b = new String("Java");
System.out.println(a == b); // false (разные ссылки)
System.out.println(a.equals(b)); // true (сравнение содержимого){}
equals() в вашем классе.
#java #equals #comparisonОтзывы канала
всего 11 отзывов
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
Java | Фишки и трюки — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 6.9K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 17.9, количество отзывов – 11, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 2237.76 ₽, а за 86 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий