这篇文章讨论了SDO API背后的
概述
SDO API包括一个动态数据API,一个数据类型自检API,和一个数据变化跟踪API。如果您一点也不知道上述概念,不要绝望:我将从最简单的概念开始并逐步进行下去。
DataObject:当不采用Java Beans时
SDO基于“数据对象”的概念,“数据对象”简单地说就是包含某个数据的一个对象实例。通常,人们使用传统的Java对象(POJO,或Java beans)或是传统的Java接口(POJI)来以一种持久性-
我们称Java bean类型的API为“静态的”,因为预先定义好的具有一系列属性(或getter/setter方法)的数据类型已经存在了。然而,静态数据API并不总能执行,因为有时Java类甚至还并不存在。举例来说,在许多动态查询中,返回数据的形式并不是已知的预先类型,这样我们就不能将数据填写到已经存在的Java类中。另一个例子是,数据结构是可扩展的;例如,对于XML数据,在您剖析它之前,您通常不知道它的精确类型(假定它的XML 模式结构是可扩展的)。
这就是 SDO 数据对象接口的便利之处:它提供了“动态的”数据API。当您需要产生一个能支持包括动态查询、未知数据类型和可括展模式等情况的通用框架时,有一个动态的数据API会更加有用。
DataObject 上的基本操作是set([property name]、[property value])和get([property name]。在 DataObject 上有更多的方法,但是我们稍后将了解它们。让我们先来看一些代码。假定我有一个person接口,如下:
public interface Person { String getName(); void setName(String name); } |
模拟的客户代码如下(假定实现person接口的一个PersonImpl Java bean存在):
Person p = new PersonImpl(); p.setName("John"); System.out.println(p.getName()); |
这是Java程序师在许多程序设计任务中使用的。但是,如果在运行时当我要处理person数据的时候,person接口却不存在,那会怎么样呢?这时我们就能使用DataObject。假定有一个DataObject的实现DataObjectImpl,它有一个默认的构造函数(注意,SDO规范的内核只定义接口),我可以写出下列代码,它同上面的代码可以完成同样的事情:
DataObject o = new DataObjectImpl(); o.set("name", "John"); System.out.println(o.get("name"));
留心的读者将会注意到,上面的代码中遗漏了一个重要的数据:DataObject的实例并不知道这个数据是person。这样,客户也不能做任何运行时的类型检查。SDO处理了这个问题,下面我们就来
退一步讲,指出Java对 DataObject API的需求有所增加是有意义的。因为Java是一种静态类型的语言,它不能在运行时将额外的字段和方法添加到对象的实例中去。也不是所有的语言都像这样。特别地,如Python,它是一种动态类型的语言,它允许属性 (等同于Java中的字段) 在运行时被添加到一个对象实例中。举个例子,下面的Python代码就粗略地等同于上面使用DataObject的Java代码。
| o = dataobject() setattr(o, "name", "John") print o.name |
上面的代码假定已经定义了名为“dataobject”的Python类。这个类可以简单地定义成:
| class dataobject: pass |
我这里给出Python代码并不是要在Python和Java之间做何评价;只不过,它更明确地说明了当需要一个动态数据API时,为什么Java需要像 DataObject 这样的类。
用户评论