1

我有点不确定这个问题的标题是什么,所以其他人可能会使用它,但是我从我的老师那里得到了这个简单的多态性示例,我试图对其进行修改。

但我不确定我的修改是否“安全”。

public class AppSystem {
   ...
   private DataPersistenceInterface DataDAO;
   private DataController DataController;
   ...

   public void createConnection(String username, String password) 
                                throws ClassNotFoundException, SQLException {

      if(username.isEmpty() || password.isEmpty()) {
           DataDAO = new DataDAO();
           DataController = new DataController(DataDAO);
         } else {
           DataDAO = new DataDAO(url, username, password, driver);
           DataController = new DataController(DataDAO);
         }
      }

   public void closeConnection() {
        DataDAO.closeConnection();
   }

我们有一个控制器和一个 DAO。DAO 实现了一个名为 DataPersistenceInterface 的接口,该接口承载了与数据库进行某些通信所需的一些方法。由于数据控制器处理所有逻辑,并且我们不希望它知道其他任何事情,因此我们以接口类型向它传递 DAO 的引用。

这就是我的老师所做的。但是,下面的方法“closeConnection”因此不起作用,因为对 DataDAO 的引用不指向 DAO 类中的任何“closeConnection”方法......

[closeConnection方法在上面的代码中显然不起作用]

现在,我的想法是改变...

   private DataPersistenceInterface DataDAO;

   private DataDAO DataDAO;

由于数据控制器在其构造函数中采用 DataPersistenceInterface 的参数,因此它不会从 DAO 对象中了解任何其他内容。现在我可以在 DAO 上调用 closeConnection 了。

但我不确定这是否“安全”?有些东西只是告诉我不是。

感谢您的时间。

4

1 回答 1

0

首先,为了代码清晰,而不是写

   private DataPersistenceInterface DataDAO;

写 :

   private DataPersistenceInterface dataPersistenceInterface;

始终对 java 属性使用驼峰式大小写,并使用与您正在使用的类相同的名称。最好的做法是将实现命名为与接口相同的名称加上一个 Impl:

DataPersistenceInterfaceImpl

这是一个模式问题,如果你想使用 Dao 的构造函数来创建连接,你有三个选择:

1)您可以通过将closeConnection方法添加到接口签名中来将其添加到DataPersistenceInterface接口:

public void closeConnection();

2) 但是因为 AppSystem 类确实知道它使用哪个实现来创建 DataPersistenceInterface (DataDao),所以您可以将接口转换回实现。你会得到你的 closeConnection() 回来。这将是我最好的客人。

   public void closeConnection() {
        ((DataDAO)dataPersistenceInterface).closeConnection();
   }

3)根据您的 AppSys 的使用情况,不要关心关闭连接。将关闭连接方法放在 DataDAO 实现的 finalize() 方法中。当 AppSys 应用程序结束时,连接将关闭。

protected void finalize() throws Throwable {
try{
connection.close;
}catch(Exception e){
...
}
}

最好的做法是使用像 c3po 或 Apache ConnectionPool 这样的 ConnectionPool。

于 2012-11-25T21:05:26.413 回答