Как использовать API потока в Java 10 для замены кода Observable / Observer (предпочтительно без использования многопоточности)? - PullRequest
0 голосов
/ 13 октября 2018

Я недавно обновил свой проект с Java 8 до Java 10 и получил МНОГО предупреждений о том, что Observer и Observable устарели.Предложением заменить их было API-интерфейс Flow. Проблема в том, что мне еще не удалось найти достойное руководство по написанию кода для API-интерфейса Flow.Все, что я обнаружил, говорит о том, что он не реализует издателя / подписчика напрямую, а также многое из того, что я обнаружил, говорит о том, что Flow API в значительной степени основан на многопоточности.

Примечание. Я уже разыскивал этот ответ в StackOverflow, а также в Quora и нескольких других сайтах, и некоторые люди утверждают, что объекты Observable нельзя сериализовать, что категорически не соответствует действительности, поскольку я реализую Serializable для каждого из них.мои бины и многие другие мои классы, а также даже сериализованы, чтобы подать несколько моих объектов и прочитать их обратно из файла обратно в форму объекта.

Тем не менее, проблема многопоточности - я не хочу использовать потоки или многопоточность при реагировании на изменения в модельном объекте.Вопрос 1: является ли это абсолютным требованием к использованию API-интерфейса Flow или существует другой набор классов / интерфейсов, которые не требуют многопоточности и потоков?

Если посмотреть на javadocs для Flow.publisher, подумайте, чтобыть тем, чем я бы заменил Observable на - потому что это интерфейс, это означает, что я предполагаю, что мне придется поместить (аналогично моим реализациям класса ListModel и TableModel) коллекцию подписчиков (аналогично Observers ??) и поместить собственный код вдобавить и удалить их из моего издателя?Вопрос 2 - Имею ли я это право?

Вопрос 3.) Что такое аргумент универсального типа в Flow.Publisher и Flow.Subscriber?Он показывает тип, но я понятия не имею, где этот тип используется - я положу код здесь для одного из моих классов моделей:

package net.draconia.frenchstudy.model;

import java.io.Serializable;

import java.util.concurrent.Flow.Publisher;
import java.util.concurrent.Flow.Subscriber;

public class Category implements Publisher<Category>, Serializable
{
    private static final long serialVersionUID = 5281400324476454101L;

    public static final Category EMPTY_CATEGORY = new Category(); 

    private Integer miId;
    private String msCategory;

    public Category()
    { }

    public Category(final int iId)
    {
        setId(iId);
    }

    public Category(final String sCategory)
    {
        setCategory(sCategory);
    }

    public Category(final int iId, final String sCategory)
    {
        setId(iId);
        setCategory(sCategory);
    }

    public String getCategory()
    {
        if(msCategory == null)
            msCategory = "";

        return(msCategory);
    }

    public int getId()
    {
        if((miId == null) || (miId < 0))
            miId = 0;

        return(miId);
    }

    public void setCategory(final String sCategory)
    {
        if(sCategory == null)
            msCategory = "";
        else
            msCategory = sCategory;

        setChanged();
        notifyObservers();
    }

    public void setId(final Integer iId)
    {
        if((iId == null) || (iId < 0))
            miId = 0;
        else
            miId = iId;

        setChanged();
        notifyObservers();
    }

    public void subscribe(final Subscriber<? super Category> subscriber)
    {

    }

    public String toString()
    {
        return(getCategory());
    }
}

Он частично убит, поскольку я пытался заменить Observable на Flow.Издатель, но понятия не имеет, что поместить в код метода подписки.Я сделал дикое предположение, что универсальный тип совпадает с типом, с которым работает класс, но я не уверен, что это правильно.

Я всегда был в порядке, когда в различные Observer'ы добавлялась логика для обработки.только 1 возможное изменение в наблюдаемом объекте и оставление других изменений другим наблюдателям - порядок казни указанных наблюдателей для меня никогда не имел значения, потому что я запрограммировал это, и он не будет зависеть от одного выполнения до или после другого.Я никогда не замечал какого-либо снижения скорости выполнения из-за того, что во многих случаях Observers выполнялся более одного раза, так что это кажется глупым решением со стороны Oracle, но я все еще хочу знать - как использовать Flow API для замены Observable / Observerкод в моей программе?Или, если это не может так работать, то что я могу использовать, потому что я видел возможное решение использовать PropertyChangeListeners, но мои объекты модели НЕ являются свойствами, и я не хочу определять свойства (Никогда не использовал PropertyChangeListener, поэтому яне уверен, как они работают) учитывая, что в десятках модельных объектов, которые будут преодолевать сотни, если не приблизиться к тысяче свойств, нужно определить, нужно ли мне их определять.Любые ссылки на учебники, код или примеры для подражания будут полезны.

...