类型检查 与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 来检查你的特定的类。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章