强制执行方法调用以避免抛出异常

时间:2016-08-31 19:58:32

标签: java database

我有一个库并创建一个实例,我使用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)
);

什么是最好的选择?

5 个答案:

答案 0 :(得分:4)

您有几个选择。

  1. 强制用户将选项作为参数传递给构造函数。
  2. 抛出一个异常,并显示一条消息,指出如果未调用connectWidth,则必须调用它。
  3. 如果有一个很好的默认设置要连接,请在构造函数中连接它。

答案 1 :(得分:1)

这是事情变得有点冗长的地方,因为它意味着:

  • 您必须在执行任何
  • 之前检查状态
  • 你必须防止开发人员做傻事。

您可以做的一件事是检查您的连接状态(确保它不为空),然后抛出一个IllegalStateException来解释它为何爆炸:

if(null == daoFactory) {
    throw new IllegalStateException("You are attempting to invoke this without a DAO Factory defined.");
}

...但您必须将此检查添加到程序中的每个方法中。

我认为首选的方法是将其添加到对象的构造函数中,因为这清楚地表明在构造实体之前需要具有此依赖性 。如此有效,我同意你的第二种方法。

可能做的最后一件事是做一些花哨的annotation processing来强制特定的编译器警告或错误,如果缺少这种依赖性,但它可能更直截了当将其添加为构造函数依赖项。

答案 2 :(得分:0)

如果addCarddeleteCard方法调用对Object的功能至关重要(即几乎总是被调用),则将其添加为构造函数。

否则,当他们以错误的顺序调用时,您可以简单地抛出详细的IllegalStateException。您还应该记录库方法,相应地说明它们正常运行所需的内容。

答案 3 :(得分:0)

(库)类Wallet应该提供了一个获取数据库端点的构造函数。由于它不可用,您可以提供一个实用程序包装器来解释它。这样,您的实用程序包装器可以强制命令端点,并确保它可以事先使用。

您可以探索的另一件事是依赖注入,即只要客户端需要Wallet,它就会@Inject Wallet wallet。诚然,这增加了复杂性,但它使代码更容易测试。 (参见javax.inject或dagger)。

答案 4 :(得分:0)

我认为,你应该实现代理设计模式来解决问题。 当客户端创建Wallet时,他们应该获得Wallet实例的代理。当客户端调用服务API时说addCard然后Real Wallet对象实例进入图片(延迟加载)并执行dao实例化,这是一个单例实例。

相关问题