Java 安全多态性实践?

Java 安全多态性实践?,java,model-view-controller,polymorphism,Java,Model View Controller,Polymorphism,我有点不确定这个问题的名称,所以其他人可能会使用它,但我有一个简单的多态性例子,我的老师,我试图修改abit 但我不确定我的修改是否安全 public class AppSystem { ... private DataPersistenceInterface DataDAO; private DataController DataController; ... public void createConnection(String username, Strin

我有点不确定这个问题的名称,所以其他人可能会使用它,但我有一个简单的多态性例子,我的老师,我试图修改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实现了一个名为DataPersistenceInterface的接口,该接口承载了一些与数据库通信所需的方法。由于datacontroller处理所有逻辑,我们不想让它知道任何其他信息,因此我们在接口类型中向它传递DAO的引用

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

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

现在,我的想法是改变

   private DataPersistenceInterface DataDAO;

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

但我不确定这样做是否安全?有些事告诉我它不是


谢谢您的时间。

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

   private DataPersistenceInterface DataDAO;
写:

   private DataPersistenceInterface dataPersistenceInterface;
对于java属性,请始终使用驼峰大小写,并使用与所使用的类相同的名称。最好的做法是将实现命名为接口的相同名称加上Impl:

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

1通过将closeConnection方法添加到接口签名,可以将其添加到DataPersistenceInterface接口:

public void closeConnection();
2但是由于AppSystem类确实知道它使用哪个实现来创建DataPersistenceInterface DataDao,因此可以将接口回溯到该实现。你会恢复你的亲密关系。这将是我最好的客人

   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这样的连接池。

1完全同意,这样做!请不要。通常的做法是定义接口并使用与其接口类型一起声明的变量来隐藏真正的实现多态性。如果要切换到另一个实现,请继续,如果使用该实现类型,则必须在每次使用中更改该类型。不要那样做。您可以使用try-catch-finally块,但VM不保证finalize方法的执行,并且有一些案例报告它的行为方式与预期不同。是的,我同意您的所有评论。。。根据用法,我的意思是如果你为你的老师做一个Hello World,但你是对的。。。
protected void finalize() throws Throwable {
try{
connection.close;
}catch(Exception e){
...
}
}