Замена устаревшего Observer в Java 9: к чему перейти?

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

java.util.Observable вышел из употребления. Теперь рекомендуется использовать PropertyChangeSupport для отслеживания изменений свойств объектов:

Java
Скопировать код
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, поддерживающий неблокирующую работу и умеющий контролировать обратное давление:

Java
Скопировать код
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();
Кинга Идем в IT: пошаговый план для смены профессии

Проработка альтернатив: что изменилось в Java 9?

Устаревание шаблона Observer вызвано стремлением Java к реализации более современных моделей параллелизма и безопасности. Стало очевидно, что для работы с такими аспектами, как сериализация и потокобезопасность, нам необходимы новые инструменты. Поэтому стоит использовать пакет Java Beans, который предлагает более гибкие средства работы с событиями.

Параллельные структуры данных: синхронизация потоков

Параллельные структуры данных из пакета java.util.concurrent помогают организовать взаимодействие между потоками, обеспечивая надёжную синхронизацию и защиту от проблем с доступностью и согласованностью данных.

Реактивные потоки: новая эпоха Observer

С приходом реактивных потоков шаблон Observer эволюционировал, превратившись в инструмент для асинхронного программирования. Это существенно упростило работу с потоковыми данными и повысило производительность.

Наследие: как работать с устаревшим кодом

Если ваша система до сих пор использует шаблон Observer, не тревожьтесь. Устаревание не означает необходимость полного переписывания системы. Это скорее побуждение к постепенному улучшению и переходу на новые парадигмы.

Визуализация

Markdown
Скопировать код
Шаблон Observer (☎️): [Наблюдатель 1, Наблюдатель 2, Субъект]

Теперь он выглядит так:

Markdown
Скопировать код
java.util.concurrent.Flow (💬):
- Издатель: отправляет сообщения
- Подписчик: получает сообщения по готовности
- Подписка: регулирует поток сообщений
- Процессор: выполняет функции как издателя, так и подписчика

Управляем сменой парадигмы

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Для эффективного перехода от шаблона Observer к новым моделям необходимо научиться управлять потоками данных, пользоваться обратным давлением с неблокирующей обработкой.

Синхронное и асинхронное: что выбрать?

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

В случае синхронных задач рекомендуются PropertyChangeListeners. Но не забывайте и про Flow API, который позволяет перейти на уровень асинхронного программирования.

Используем эволюцию в своих интересах

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Обновляйте свои инструменты, чтобы ваши приложения становились устойчивыми, отзывчивыми и лёгкими в поддержке. Будьте лидерами, путь от Observer — это путь к будущему разработки Java-приложений.

Полезные материалы

  1. Observable (Java SE 9 & JDK 9) — Официальная документация на устаревший шаблон Observer.
  2. Effective Java, 3rd Edition — Основательное пособие по лучшим практикам Java, применяемым и к шаблону Observer.
  3. Project Reactor — Платформа для реактивного программирования на Java.
  4. Введение в Java 9 Flow API — Практическое руководство по использованию Flow API.
  5. Понимание Java 8 CompletableFuture — Руководство по работе с CompletableFuture в Java.