为什么我们将对象存储在接口引用中?

时间:2013-07-05 05:49:43

标签: java jdbc polymorphism

我对接口有疑问 我看过一些代码,他们正在编写

Connection con = Drivermanager.getConnection("URL","User name","Pwd");

这里con(连接接口的参考变量)持有Oracle Connection Object。 因为我们知道我们正在创建Oracle连接对象,为什么我们不能写

OracleConnectionClass Oraclecon = Drivermanager.getConnection("URL","User name","Pwd");

如果我问一些人他们说,他们通过使用连接接口实现多态性。

但是,
有什么用。
我们可以做到

通过两个引用(con和Oraclecon)创建语句,执行查询等。

simillarly for List和ArrayList
提前致谢

3 个答案:

答案 0 :(得分:7)

您知道您现在正在创建的确切类型,但由于您自己的代码更改或实施更改,这可能会在未来发生变化。

多态性用于抽象细节,因此您不必在以后触摸代码。如果您在此处使用了确切类型而不是界面,并且该类型已更改,则您必须更改代码。

这种后果似乎很明显。改变代码是工作,工作需要花钱,因此更少的改变意味着更低的成本。

但它更贵。每次更改稳定代码时都有可能引入错误。这个风险很低,但也值得一提。

这就是他们使用界面的原因。

这是多态性的一个很好的例子。

Queue<Float> queue = new LinkedList<Float>();

我们可以简单地改变行为。

Queue<Float> queue2 = new BlockingQueue<Float>();

或者这个怎​​么样?

Queue<Float> queue3 = new PriorityBlockingQueue<Float>();

我们可以使用所有队列来快速改变行为。

答案 1 :(得分:3)

简短的回答是“因为我们不关心它是OracleConnection”。它可以更改为MySQLConnection,代码仍然有效,因为它们都会实现Connection类。

另一个例子是List接口。

List<String> l = new ArrayList<String>();

如果您需要更改列表类型,则只需更改一个位置。

List<String> l = new LinkedList<String>();

答案 2 :(得分:3)

在一个紧密耦合编写的代码中,除了像我使用多态之类的奇特名称之外什么都没有。

但是想象一下当你有一个实例变量为

的情况
Connection con;

和接受连接的参数化构造函数

public businessDao(Connection con){
this.con = con;
}

//使用连接的某些功能

现在构造函数可以接受实现Connection接口的任何类型的连接对象

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance() 

或jndi连接如下

dataSource = (DataSource) context.lookup("java:comp/env/jdbc/jelasticDb");
con = dataSource.getConnection();

您不需要使用连接类型对代码进行硬编码,只需传递所需类型的对象即可。

您可以在Dependency Injection中找到多态的实际用法。