У меня есть класс, который я использую для загрузки. Класс является наблюдаемым, и я использую его как объект модели UI свинга. Однако это слишком медленно, как для запуска (с http-рукопожатия, я полагаю, так мало я могу с этим поделать, вероятно), так и с синхронизированного доступа.
Интерфейс класса:
public File getDownloadedFile()
public String getMimeType()
public synchronized BigInteger getExpectedSize()
public URL getURL()
public synchronized boolean cancel()
public synchronized boolean retry()
public synchronized boolean isDone()
public synchronized boolean isCancelled()
public synchronized BigInteger getProgress()
public String getName()
public synchronized BigInteger getBytesRead()
public synchronized BigDecimal getBytesPerSecond()
public synchronized BigDecimal getTimeRemaining()
public synchronized void start()
Я хочу исключить синхронизированные файлы, но я знаю, что для этого мне нужно сделать способ сделать этот класс неизменным. Я попытался смоделировать это как конечный автомат (скрытый внутри), однако среднее (работающее) состояние имеет InputStream + поток. Как правильно превратить это в неизменную обертку?
1) Превратить класс в обертку для конечного автомата + неизменное состояние. Начните запуск первого состояния машины, затем уведомляйте наблюдателей о каждом изменении состояния с помощью неизменной копии. (Однако ожидание клиента монолитного класса - для модели Swing UI для бывших, проблематично.
2) Откажитесь от использования обертки в качестве модели качелей. просто зарегистрируйте мой контроллер в качестве наблюдателя, запустите и добавьте первое (неизменяемое) состояние в качестве модели и используйте неизменный идентификатор состояния (например, URL-адрес загрузки), чтобы распознать состояние конечного автомата загрузки, отправляемое notifyObservers (), как принадлежащее некоторой загрузке , чтобы заменить каждое последующее состояние + обновить пользовательский интерфейс. Однако я не думаю, что это очень удобно, когда это используется без интереса к уведомлению. По крайней мере, было бы неплохо ждать завершения загрузки?