在以下各节中,我将描述用来定义 RGO 编程框架(也称为 API)的类和方法。本文中讨论的所有类都在缺省 Java 包中。
有两种不同的方法来持久地存储 Drawable 对象。第一种方法使用 Java 平台的 Serializable 接口和 ObjectStreams ,该方法需要的代码量最少。这种方法中,每个 Drawable 对象和所有可从该方法获得的对象都必须实现 Serializable 接口。第二种方法(称为“自存储”,或者显式地为持久字段的存储编码)需要更多编码,但产生的持久文件要小得多(通常不到那些使用 Serializable 生成的文件大小的一半)。在保存复杂图形时,这个大小差别是很重要的。例如,比较存储包含 25 个测试 DrawableText 对象的图形所需的空间 ― 使用 Serializable 接口创建的文件大小为 2,636 字节,而使用“自存储”方法创建的文件大小为 1,284 字节。
在“自存储”方法中,持久保存的 drawables 继承了 PersistentDrawable 类。每个带新数据字段的 PersistentDrawable 子类必须定义 storeOn() 和 loadFrom() 方法。
drawables 包
在示例 drawables 包中找到的类是以表 1 中显示的层次结构组织起来的。
表 1. drawables 包的类层次结构
| 类名 | 属性 | 实现方法 |
Drawable | abstract, public | draw 、 storeOn 、 loadFrom |
DrawableBox | public | drawWorker 、 storeOn 、 loadFrom |
DrawableLine | public | drawWorker 、 storeOn 、 loadFrom |
DrawableOval | public | drawWorker 、 storeOn 、 loadFrom |
DrawableRectForm | abstract, public | storeOn 、 loadFrom |
DrawableBox | public | drawWorker |
DrawableOval | public | drawWorker |
DrawableSprite | public | drawWorker 、 storeOn 、 loadFrom |
DrawableText | public | drawWorker 、 storeOn 、 loadFrom |
我已经在 Drawable 或者 DrawableRectForm 超类中放置了尽可能多的公共行为。
方法和构造器
下列方法和构造器对于组成 drawables 包的类是公共的。
clone() 方法
标准 Java 类库的一个弱点是很少使用 java.lang.Cloneable 接口。很明显 Java 语言的设计者考虑到了克隆,因为 clone() 方法已在 java.lang.Object 类中定义。但他们还是决定在没有实现 Cloneable 接口的类中禁止该方法。让大多数类(如果不是所有的类)实现标准的克隆方法后,类(特别是象 Point 和 Rectangle 这样的简单数据结构类)产生一个一致的办法来复制这些对象。没有这个办法,您有时必须通过使用复制构造器,或者通过带有待复制对象字段的引用(作为参数)的普通构造器,或者通过目标类的其它一些工厂(factory)方法来创建对象的副本。这样的选择取决于目标类。它迫使复制代码要知道要进行复制的目标类型。通用克隆能力则无须这么做。 clone() 方法提供给了本文(在它实际可以使用的地方)中定义的所有类。
toString() 方法
每个类实现 toString() 方法。这样允许类的实例用在 String 实例所需的任何地方(比如用于打印实例)。在类不是 final(也就是说,类可以生成子类)的情况下, toString 行为在 toString() 方法(它生成类名称和括起的括号)和 bodyToString() 方法(它生成对象的内容)之间被分割。(这类似于通常用在 java.awt 和 javax.swing 包中的 toString() 方法和 paramString() 方法。)
这个方法允许所有的子类使用公共 toString() 方法,而允许一个子类一个子类地进行特定格式编排。
构造器类型 drawables 包中的每个类可以支持几种构造器类型:
缺省构造器:这是一个不带参数的构造器。缺省构造器用于类 Drawable 的所有非抽象子类来支持持久对象的重新装入。如果在参数没有提供信息的情况下无法使对象处于可用状态,特殊的类就可能不提供缺省构造器。
普通构造器:这个构造器提供在实例创建时指定的所有参数。
备用构造器:这个构造器提供在实例创建时指定的参数子集(通常是常用的那些)。请注意,一些类不能提供备用构造器。
复制构造器:这个构造器通过复制相同类的另一个实例来初始化新创建的对象。 clone() 方法使用它。这样,它就可以被提供 clone() 方法的任意类所使用。
访问方法
访问方法提供了对重要的私有(private)或者受保护的(protected)实例变量的公开(public)访问。要获取变量值,可以使用 get