Я недавно обновил свой проект с 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, поэтому яне уверен, как они работают) учитывая, что в десятках модельных объектов, которые будут преодолевать сотни, если не приблизиться к тысяче свойств, нужно определить, нужно ли мне их определять.Любые ссылки на учебники, код или примеры для подражания будут полезны.