類型檢查 與Java 多態相結合及反射機制相結合

運行期類型識別(RTTI,run-time type identification)的概念初看起來非常簡單:當你只有
一個指向對象的基類的引用時,RTTI 機制可以讓你找出這個對象確切的類型。
 
對 RTTI 的需要,揭示了面向對象設計中許多有趣(並且複雜)的問題,同時也提出瞭如何
組織程序的問題。

討論 Java 是如何允許我們在運行期識別對象和類的信息。主要有兩種方式:一種
是傳統的 RTTI,它假定我們在編譯期和運行期已經知道了所有的類型;另一種是“反射機
制(reflection)”,它允許我們在運行期獲得類的信息。我們先討論“傳統”的 RTTI,再討論
反射。

 

Java 是通過 Class 對象來實現 RTTI 機制的,即使我們只是要做些諸如類型轉換這類的
情。Class 類也提供了許多其他途徑,以方便我們使用 RTTI。
 
首先,你需要獲得指向適當的 Class 對象的引用。一種辦法是用字符串以
Class.forName()方法,就象前例演示的那樣。這種做法很方便,因爲你在獲取 Clas
的引用事,並不需要生成該 Class 類型的對象。然而,如果你已經有了一個你感興趣的
型的對象,那麼你就可以通過調用 getClass()來獲取 Class 的引用,這是根類 Objec
提供的方法。它返回 Class 的引用,用來表示對象的實際類型。Class 提供了一些有趣
方法,下面的例子爲你展示這些方法:

RTTI 允許你通過匿名基類的引用來發現類型信息。初學者極易誤用它,因爲在學會使用多
態調用方法之前,這麼做也很有效。對許多有過程化編程背景的人來說,很難讓他們不把程
序組織成一系列 switch 語句。他們可能會用 RTTI 做到這一點,但是這樣就在代碼開發和
維護過程中損失了多態機制的重要價值。Java 希望我們始終使用多態機制,只在必需的時
候使用 RTTI。
 
然而使用多態機制的方法調用,要求我們擁有基類定義的控制權,因爲在你擴展程序的時候,
可能會發現基類並未包含我們想要的方法。如果基類來自一個庫,或者由別人控制,這時候
RTTI 便是一種解決之道:可繼承一個新類,然後添加你需要的方法。在代碼的其他地方,
你可以識別自己特定的類,並調用你自己的方法。這樣做不會破壞多態性以及程序的擴展能
力,因爲這樣添加一個新的類並不需要你在程序中搜索 switch 語句。但如果你在程序主
體中添加你需要的新特性的代碼,就必須使用 RTTI 來檢查你的特定的類。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章