Замена устаревшего Observer в Java 9: к чему перейти?
Быстрый ответ
java.util.Observable
вышел из употребления. Теперь рекомендуется использовать PropertyChangeSupport
для отслеживания изменений свойств объектов:
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
public class ObservableBean {
private PropertyChangeSupport pcs = new PropertyChangeSupport(this);
private String value;
public void addPropertyChangeListener(PropertyChangeListener listener) {
pcs.addPropertyChangeListener(listener);
}
public void setValue(String newValue) {
String oldValue = this.value;
this.value = newValue;
pcs.firePropertyChange("value", oldValue, newValue);
}
}
// Пример применения
ObservableBean bean = new ObservableBean();
bean.addPropertyChangeListener(evt -> System.out.println("Изменено: " + evt.getNewValue()));
bean.setValue("Hello"); // Привет, новый мир наблюдателей
Для асинхронной и реактивной обработки потоков рекомендуется использовать java.util.concurrent.Flow
, поддерживающий неблокирующую работу и умеющий контролировать обратное давление:
import java.util.concurrent.Flow.Subscriber;
import java.util.concurrent.Flow.Subscription;
import java.util.concurrent.SubmissionPublisher;
SubmissionPublisher<String> publisher = new SubmissionPublisher<>();
Subscriber<String> subscriber = new Subscriber<>() {
public void onSubscribe(Subscription subscription) {
subscription.request(1);
}
public void onNext(String item) {
System.out.println("Получено: " + item);
}
public void onError(Throwable t) { t.printStackTrace(); }
public void onComplete() { System.out.println("Подписка завершена"); }
};
publisher.subscribe(subscriber);
publisher.submit("данные");
publisher.close();
Проработка альтернатив: что изменилось в Java 9?
Устаревание шаблона Observer вызвано стремлением Java к реализации более современных моделей параллелизма и безопасности. Стало очевидно, что для работы с такими аспектами, как сериализация и потокобезопасность, нам необходимы новые инструменты. Поэтому стоит использовать пакет Java Beans, который предлагает более гибкие средства работы с событиями.
Параллельные структуры данных: синхронизация потоков
Параллельные структуры данных из пакета java.util.concurrent
помогают организовать взаимодействие между потоками, обеспечивая надёжную синхронизацию и защиту от проблем с доступностью и согласованностью данных.
Реактивные потоки: новая эпоха Observer
С приходом реактивных потоков шаблон Observer эволюционировал, превратившись в инструмент для асинхронного программирования. Это существенно упростило работу с потоковыми данными и повысило производительность.
Наследие: как работать с устаревшим кодом
Если ваша система до сих пор использует шаблон Observer, не тревожьтесь. Устаревание не означает необходимость полного переписывания системы. Это скорее побуждение к постепенному улучшению и переходу на новые парадигмы.
Визуализация
Шаблон Observer (☎️): [Наблюдатель 1, Наблюдатель 2, Субъект]
Теперь он выглядит так:
java.util.concurrent.Flow (💬):
- Издатель: отправляет сообщения
- Подписчик: получает сообщения по готовности
- Подписка: регулирует поток сообщений
- Процессор: выполняет функции как издателя, так и подписчика
Управляем сменой парадигмы
Для эффективного перехода от шаблона Observer к новым моделям необходимо научиться управлять потоками данных, пользоваться обратным давлением с неблокирующей обработкой.
Синхронное и асинхронное: что выбрать?
В случае синхронных задач рекомендуются PropertyChangeListeners
. Но не забывайте и про Flow API
, который позволяет перейти на уровень асинхронного программирования.
Используем эволюцию в своих интересах
Обновляйте свои инструменты, чтобы ваши приложения становились устойчивыми, отзывчивыми и лёгкими в поддержке. Будьте лидерами, путь от Observer — это путь к будущему разработки Java-приложений.
Полезные материалы
- Observable (Java SE 9 & JDK 9) — Официальная документация на устаревший шаблон Observer.
- Effective Java, 3rd Edition — Основательное пособие по лучшим практикам Java, применяемым и к шаблону Observer.
- Project Reactor — Платформа для реактивного программирования на Java.
- Введение в Java 9 Flow API — Практическое руководство по использованию Flow API.
- Понимание Java 8 CompletableFuture — Руководство по работе с CompletableFuture в Java.