gpt4 book ai didi

java - 具有 CRUD 静态方法的观察者模式和 DAO 类

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:20:12 24 4
gpt4 key购买 nike

我正在审查一些 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

这看起来很老套,所以我想添加一个

static {
Notification.addChangeListener(this);
}

在 OfficeDAO.java 类中,但当然“this”引用不存在于静态初始化程序中,所以我没有解决方案。从 DAO 方法中删除静态是没有问题的,因为这些方法在整个应用程序中被调用,并且在没有类实例的情况下被调用。

我目前是否缺少任何干净的解决方案或解决方法?

最佳答案

这似乎是一个相当困惑的场景,创建一个新对象只是为了向 Notification 添加一个监听器似乎更像是一种反模式。我的假设是这是一些遗留代码的一部分,并且不可能进行太多代码重构。我可以说,由于 DAO 层的行为更像一个单例,您可以嵌入一个预先创建的 DAO 实例并通过静态引用访问它。

private static OfficeDAO myDAO = new OfficeDAO(); //The constructor code remains the same

关于java - 具有 CRUD 静态方法的观察者模式和 DAO 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29828853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com