我不确定该问题的标题是什么,因此其他人可能会使用它,但我有一个我老师的多态性的简单例子,我试图修改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。
但我不确定这是否“安全”?有些东西告诉我它不是。
感谢您的时间。
答案 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。