2

我有一个 Java Swing 应用程序。我想将信息上传到 Web 端点,该过程需要足够的时间来证明将工作转移到另一个线程是合理的。我想使用 Swing SwingWorker 范例来做到这一点。我对应该在哪里扩展 SwingWorker 感到困惑。

现在,我为每个 Web 端点都有一个类,该类存储发往该端点的所有数据,以及与端点交互所需的代码(位于名为 upload() 的方法下)。这些类是否应该实现 SwingWorker,因为它需要执行其任务的所有数据都在那里?或者我应该有一个辅助类 FooWorker 实现 SwingWorker,它将从内部 Site 对象调用 Upload()?

如果我创建了一个辅助 FooWorker 类,那么似乎我必须费力地将对站点的引用填充到我实例化的每个 FooWorker 对象中(每个 Web 端点一个线程/工作者),但站点不会被一堆 SwingWorker 方法和代码污染。

如果我使用 Site 类扩展 SwingWorker,那么我可以直接从每个站点的 EDT 调用 .execute() ,这对我来说比为每个站点创建一个工作人员,然后让该工作人员调用 upload()离开网站。

只是寻找关于哪种方法更好的意见和想法。Site 类已经相当复杂,如果我扩展 SwingWorker 类,我怕会在其中放入一堆与领域无关的东西。但是 FooWorker 类,如果我走那条路,基本上只是对 Site 类的一个薄包装。这个包装器是否值得让 Site 类只关注它自己的域方法/数据?

4

1 回答 1

2

在有意义的地方引入抽象总是一个好主意。在这种情况下,我会说这是有道理的,因为您最终可能会创建多个 SwingWorker 类。

您可以考虑创建一个名为 SiteWorker 的单个 SwingWorker 类。然后,我将创建实现方法upload() 的站点接口。每个代表与站点端点连接的类都将实现此站点接口。然后,您可以简单地让 SiteWorker 处理 Site 接口,而不必处理实现 SwingWorker 的所有不同类型的 Site 类。

请记住,编程到接口而不是实现。如果您可以只创建一个 SiteWorker,然后专注于各种站点实施,那么您的生活会更轻松。

因此,您可以将 Site 实例(可以是任何实现 Site 的类)作为参数传递给 SiteWorker 类,然后它会在其 doInBackground() 方法中简单地调用实现 Site 的实例的 upload() 方法。

于 2012-08-08T21:01:09.897 回答