首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安全多态实践?

安全多态实践?
EN

Stack Overflow用户
提问于 2012-11-25 20:35:55
回答 1查看 258关注 0票数 1

我不知道如何命名这个问题,因此其他人可能会使用它,但我有一个简单的多态的例子,从我的老师,我试图修改am。

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

代码语言:javascript
复制
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方法在上述代码中不起作用。

我的想法就是改变一下..。

代码语言:javascript
复制
   private DataPersistenceInterface DataDAO;

代码语言:javascript
复制
   private DataDAO DataDAO;

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

但我不确定这样做是否“安全”?有件事告诉我这不是。

谢谢您抽时间见我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-25 21:05:26

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

代码语言:javascript
复制
   private DataPersistenceInterface DataDAO;

写:

代码语言:javascript
复制
   private DataPersistenceInterface dataPersistenceInterface;

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

代码语言:javascript
复制
DataPersistenceInterfaceImpl

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

1)可以将closeConnection方法添加到DataPersistenceInterface接口中,方法是将它添加到接口签名中:

代码语言:javascript
复制
public void closeConnection();

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

代码语言:javascript
复制
   public void closeConnection() {
        ((DataDAO)dataPersistenceInterface).closeConnection();
   }

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

代码语言:javascript
复制
protected void finalize() throws Throwable {
try{
connection.close;
}catch(Exception e){
...
}
}

最好的做法是使用类似于ConnectionPool的c3po或。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13555242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档