我正在审查一些DAO类,它们公开了CRUD静态方法create()、delete()等等。每个DAO类通过检查Notification.java类中数据库的变化来实现观察者模式,并在接收到一个变化通知时从数据库中提取对象。
简化后的代码类似于:
OfficeDAO.java
现在的问题是addChangeListener(this)在构造函数中,但由于该DAO类是通过其静态方法使用的,因此构造函数永远不会被调用。
为了解决这个问题,在应用程序的main()方法中(顺便提一下,这是EDT线程内部),有一个类似于以下的调用:
这似乎很不专业,因此我认为应该添加一个。
在OfficeDAO.java类中,但当然静态初始化器中不存在“this”引用,所以我无解。 从DAO方法中删除static是不可行的,因为这些方法在整个应用程序中都被调用,并且在没有类实例的情况下被调用。 是否有任何干净的解决方案或解决方法,我目前是否遗漏了?
简化后的代码类似于:
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
这似乎很不专业,因此我认为应该添加一个。
static {
Notification.addChangeListener(this);
}
在OfficeDAO.java类中,但当然静态初始化器中不存在“this”引用,所以我无解。 从DAO方法中删除static是不可行的,因为这些方法在整个应用程序中都被调用,并且在没有类实例的情况下被调用。 是否有任何干净的解决方案或解决方法,我目前是否遗漏了?