2013-07-05 56 views
2

我對接口有疑問。
我已經看到了一些代碼,他們寫爲什麼我們將對象存儲在接口引用中?

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

這裏CON(連接接口的參考varible)持有Oracle連接對象。 因爲我們知道,我們正在創建Oracle連接對象爲什麼不能我們寫

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

,如果我問了一些人,他們說,他們是實現多態性,通過使用連接接口。

但是,
有什麼用。
我們可以做

兩個引用(con和Oraclecon)創建語句,執行查詢..等。

simillarly的名單和ArrayList
預先感謝

+0

這並不簡單,因爲你認爲,你必須閱讀爲什麼要使用接口和他們的優點,然後纔得到您的答案 –

回答

6

你知道你正在創建現在的確切類型,但可能在未來因你自己的代碼變化而變化,或實施變更。

多態性用於抽象出細節,因此您不必稍後再觸摸代碼。如果您在此處使用的是確切類型而不是界面,並且該類型已更改,則必須更改代碼。

這個後果似乎很明顯。更改代碼是工作,工作成本的錢,因此更少的變化意味着更少的成本。

但它更昂貴。每次您更改穩定的代碼時,您都有可能引入錯誤。這裏的風險很低,但也值得一提。

這就是他們使用接口的原因。

這是一個很好的多態性能力的例子。

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

我們可以簡單地引起一個很大的變化。

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

或者如何呢?

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

所有都是我們可以用來快速改變行爲的隊列。

+0

+1很不錯的答案 – Bohemian

2

簡短的回答是「因爲我們不在乎它是OracleConnection」。它可以更改爲MySQLConnection,並且代碼仍然可以工作,因爲兩者都會實現Connection類。

另一個例子是List接口。

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

如果您需要更改列表類型,則只需更改一個位置。

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

在編寫緊密耦合的代碼中,它實現的只是像我使用多態性這樣的奇特名稱。

但是當你有一個實例變量作爲

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找到實際使用的多態性。

+0

請清理你的語法。 +1提到依賴注入。 –

相關問題