【发布时间】:2015-04-23 16:05:55
【问题描述】:
我正在审查一些 DAO 类,它们将 CRUD 静态方法 create()、delete() 等暴露给程序,并且每个 DAO 类通过通知检查数据库中的更改来实现观察者模式。 java 类,如果通过从数据库中提取对象接收到一个更改通知。
简化的代码类似这样:
OfficeDAO.java
public class OfficeDAO implements PropertyChangeListener
{
public OfficeDAO()
{
/*
* Below we add ourselves to the observers of class Notifications
* (see observer pattern in Java) in practice we are notified
* when one of our objects is changed by a remote client user
*/
Notification.addChangeListener(this);
}
public static void create(Office office)
{
Connection connection = DBConnection.getConnection();
//... stuff with the database insertion
Notification.notifyDatabaseChanges("ocreate-" + officeId);
}
}
现在的问题是 addChangeListener(this);是在构造函数中,但因为这个 DAO 类是通过其静态方法使用的,所以从不调用构造函数。
要在应用程序的 main() 方法中解决这个问题(顺便说一下,在 EDT 线程内),有一个类似的调用:
new OfficeDAO(); //ignore this, it is needed only to start the DAO constructor
这看起来很hacky所以我想添加一个
static {
Notification.addChangeListener(this);
}
在 OfficeDAO.java 类中,但静态初始化程序中当然不存在“this”引用,所以我没有解决方案。 从 DAO 方法中删除静态是不可能的,因为这些方法在整个应用程序中被调用,并且在没有类实例的情况下被调用。
我目前缺少任何干净的解决方案或解决方法吗?
【问题讨论】:
-
PropertyChangeListener 是否也只包含在每个 DAO 中重新定义的静态方法?你能显示 PropertyChangeListener 和 Notification 类的代码吗?此外,在经典的观察者模式中,是 Observable 通知观察者其状态发生变化
标签: java dao observer-pattern