安全多态实践?

时间:2012-11-25 20:35:55

标签: java model-view-controller polymorphism

我不确定该问题的标题是什么,因此其他人可能会使用它,但我有一个我老师的多态性的简单例子,我试图修改abit。

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

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的接口,该接口托管了与数据库进行一些通信所需的一些方法。由于datacontroller处理所有逻辑,并且我们不希望它知道任何其他内容,因此我们在接口类型中传递DAO的引用。

这就是我老师的所作所为。但是,由于对DataDAO的引用并未指向DAO类中的任何“closeConnection”方法,因此以下方法“closeConnection”将无法正常工作...

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

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

   private DataPersistenceInterface DataDAO;

   private DataDAO DataDAO;

由于datacontroller在其构造函数中接受了DataPersistenceInterface的参数,因此它无法从DAO对象中了解任何其他内容。现在我可以在DAO上调用closeConnection。

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

感谢您的时间。

1 个答案:

答案 0 :(得分: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的用途,不关心关闭连接。将close连接方法放在DataDAO实现的finalize()方法中。 AppSys应用程序结束时,连接将关闭。

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

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