【发布时间】:2010-12-16 02:49:19
【问题描述】:
我有一个显示部门文档的项目。我将所有文档(从数据库中获取)存储在一个静态 arrayList 中。每隔 X 小时,我就会根据数据库中的新文档(如果有)重建该 arrayList。还有一个静态变量可以控制是否重建该数组,在执行重建任务的方法中设置和取消设置。每个访问服务器的 Web 浏览器都会创建此类的实例,但 doc arrayList 和该控制变量在所有类实例之间共享。
Find-Bugs 工具抱怨“从实例方法 someClassMethod 写入静态字段 someArrayName 和 someVariableName”。似乎这不是一件好事(让类实例方法写入静态字段)。有没有人有很好的建议如何解决这个问题?谢谢。
【问题讨论】:
-
好的是的。由于每次点击(如果 JSF2.0 是新会话或新视图)都会生成一个类实例,我不想创建许多包含相同文档的重复数组列表。谢谢。
-
Charles:您需要一个实例可以引用的单例“管理器”对象。使用静态实例来实现单例有一些棘手的副作用。更好的方法是创建一个管理器对象,并以某种方式将每个实例指向该对象。如果您在创建实例的框架下工作(相对于您自己运行 java),请查看如何创建单例对象。例如,Tomcat 有某种可以读/写的上下文,作为处理持久状态的一种方式——但我对它不太熟悉。
-
感谢您的帮助。我在其中添加了一个单例类,每隔 X 小时重建文档静态树或静态数组列表。由于我使用的是 JSF,JSF PhaseListeners 由所有 JSF web 请求共享,所以我将实例化单例类放在 phaseListener 中,工作正常。虽然重建树时存在线程访问风险,但我可以将树重建时间设置为午夜,并且树是只读的。我们的流量很低,所以应该没问题。