我有一个库并创建一个实例,我使用connectWith()方法发送数据库模型:
Wallet wallet = new WalletPoket();
wallet.connectWith(
DAOFactory.getDAOFactory(DAOFactory.MYSQL)
);
遵循这些方法:
int privateCardId = wallet.addCard(1, "Economy 1");
boolean wasDeleted = wallet.deleteCard(privateCardId);
...
如果未事先调用connectWith()方法,则调用前面的方法将导致NullPointerException。 是否可以强制用户调用connectWith()方法或向用户显示警告(如果不是)? 从构造函数中调用方法是否可以接受?
Wallet wallet = new WalletPoket(
DAOFactory.getDAOFactory(DAOFactory.MYSQL)
);
什么是最好的选择?
答案 0 :(得分:4)
您有几个选择。
connectWidth
,则必须调用它。答案 1 :(得分:1)
这是事情变得有点冗长的地方,因为它意味着:
您可以做的一件事是检查您的连接状态(确保它不为空),然后抛出一个IllegalStateException
来解释它为何爆炸:
if(null == daoFactory) {
throw new IllegalStateException("You are attempting to invoke this without a DAO Factory defined.");
}
...但您必须将此检查添加到程序中的每个方法中。
我认为首选的方法是将其添加到对象的构造函数中,因为这清楚地表明在构造实体之前需要具有此依赖性 。如此有效,我同意你的第二种方法。
你可能做的最后一件事是做一些花哨的annotation processing来强制特定的编译器警告或错误,如果缺少这种依赖性,但它可能更直截了当将其添加为构造函数依赖项。
答案 2 :(得分:0)
如果addCard
和deleteCard
方法调用对Object
的功能至关重要(即几乎总是被调用),则将其添加为构造函数。
否则,当他们以错误的顺序调用时,您可以简单地抛出详细的IllegalStateException
。您还应该记录库方法,相应地说明它们正常运行所需的内容。
答案 3 :(得分:0)
(库)类Wallet
应该提供了一个获取数据库端点的构造函数。由于它不可用,您可以提供一个实用程序包装器来解释它。这样,您的实用程序包装器可以强制命令端点,并确保它可以事先使用。
您可以探索的另一件事是依赖注入,即只要客户端需要Wallet
,它就会@Inject Wallet wallet
。诚然,这增加了复杂性,但它使代码更容易测试。 (参见javax.inject或dagger)。
答案 4 :(得分:0)
我认为,你应该实现代理设计模式来解决问题。 当客户端创建Wallet时,他们应该获得Wallet实例的代理。当客户端调用服务API时说addCard然后Real Wallet对象实例进入图片(延迟加载)并执行dao实例化,这是一个单例实例。