【发布时间】:2013-04-10 09:44:22
【问题描述】:
我正在构建一个应用程序,它基本上只是一个用于显示和编辑单个对象的 GUI。由于这个对象的类是用JAXB创建的,所以它基本上是一棵树,有很多字符串和整数作为孩子,但也有一些List<E>s。对于每个简单的子 JAXB 都提供了一个 getter 和一个 setter,但对于所有列表,只提供了一个 getter,因为它提供了对内部列表的引用,现在可以对其进行修改。
由于我需要在一个单独的摆动 GUI 组件中显示每个子项(和分支),我需要这些视图来处理一些数据。根据我目前对模型视图控制器设计模式的了解,我应该严格将模型与视图分开。在此之后,让JList 直接在我的基础对象的内部列表上操作将是一个坏主意。 (实际上这样做对于我的特定用例来说是一个非常简单的解决方案,但由于以后可能会添加其他功能,我认为我应该避免这个想法。)
然后我开始思考:如果我不让组件直接在列表上工作,我必须让它们使用原始的副本。但是由于我无法将原始列表设置为我的 GUI 组件返回的新列表,因此在将视图数据保存到我的模型时,我必须再次复制这些项目。此外,分发对自定义 ListModel 的内部列表的引用也是不明智的,这意味着根据 GUI 结构的深度,可能会多次复制该列表。
由于我还希望我的应用程序高效,因此这似乎也不是正确的方法。如何“正确”构建它?
总结:
来自原始对象的
List<E>是对内部列表的引用 对象。显示列表的
JList不应获得此引用, 因此它必须复制列表。从
JList获取列表不应该在 对内部列表的引用,因此必须再次复制。将列表保存到原始对象必须将列表复制三分之一 时间,因为原始对象没有列表的 setter 方法。 (看 详情见上)
我的理解正确吗?如何正确构建它并使其高效?
P.S:在原始类结构中添加 setter 方法不是一种选择!
【问题讨论】:
标签: java list design-patterns jaxb