2

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

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

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

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

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

但是,
有什么用。
我们能做的

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

类似 List 和 ArrayList
在此先感谢

4

3 回答 3

7

您知道您现在正在创建的确切类型,但是由于您自己的代码更改或实现更改,将来可能会更改。

多态性用于抽象出细节,因此您以后不必接触代码。如果您在这里使用了确切的类型而不是接口,并且该类型发生了变化,则您必须更改代码。

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

但它甚至更贵。每次更改稳定的代码时,都有引入错误的风险。这种风险在这里很低,但也值得一提。

这就是他们使用接口的原因。

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

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

我们可以简单地使行为发生大的变化。

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

或者这个怎​​么样?

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

所有这些都是我们可以用来快速改变行为的队列。

于 2013-07-05T05:52:28.703 回答
3

一个简短的回答是“因为我们不在乎它是一个 OracleConnection”。它可以更改为 MySQLConnection 并且代码仍然可以工作,因为两者都将实现 Connection 类。

另一个例子是 List 接口。

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

如果需要更改列表类型,只需更改一处即可。

List<String> l = new LinkedList<String>();
于 2013-07-05T05:53:10.957 回答
3

在编写紧密耦合的代码中,它只实现了像我使用多态性这样的花哨名称。

但是想象一下当你有一个实例变量的情况

Connection con;

和一个接受 Connection 的参数化构造函数

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中找到多态性的实际使用。

于 2013-07-05T06:08:13.377 回答