我不知道如何命名这个问题,因此其他人可能会使用它,但我有一个简单的多态的例子,从我的老师,我试图修改am。
但我不确定我的修改是否“安全”。
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;至
private DataDAO DataDAO;由于datacontroller在其构造函数中使用了DataPersistenceInterface的参数,因此它无法从DAO对象了解任何其他信息。现在我可以在DAO上调用closeConnection了。
但我不确定这样做是否“安全”?有件事告诉我这不是。
谢谢您抽时间见我。
发布于 2012-11-25 21:05:26
首先,为了代码清晰,而不是编写
private DataPersistenceInterface DataDAO;写:
private DataPersistenceInterface dataPersistenceInterface;对于java属性始终使用camel大小写,并使用与您使用的类相同的名称。最好的做法还应该是将实现命名为接口的相同名称加上一个Impl:
DataPersistenceInterfaceImpl这是一个模式问题,如果您想使用Dao的构造函数创建一个连接,您有三个选择:
1)可以将closeConnection方法添加到DataPersistenceInterface接口中,方法是将它添加到接口签名中:
public void closeConnection();但是,因为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){
...
}
}最好的做法是使用类似于ConnectionPool的c3po或。
https://stackoverflow.com/questions/13555242
复制相似问题