定制Java ResourceBundle类实现代码灵活性

来源:百度文库 编辑:神马文学网 时间:2024/05/01 17:04:30
定制Java ResourceBundle类实现代码灵活性 出自:zdnet Builder.com 2002年09月01日 22:05 从使用局部化资源的源代码中把前者分离出来是一种常用的程序设计。java.util包内的ResourceBundle类就提供了这种方式的直接处理。不过,资源包和局部化对象之间存在紧密耦合,而你多半并不愿意在应用程序中直接编码。为了避免出现这样的情况,同时也是为了方便存储格式和资源定位的修改。你可以创建定制的ResourceBundle类来实现以上的目标。
为什么要定制ResourceBundle类
定制标准的ResourceBundle类可以让你根据其存储格式和位置抽象局部化的资源,同时还可以便利新类型ResourceBundle对象的创建。通常以下列方式使用 ResourceBundle:
String localizedMsg = ResourceBundle.getBundle("resources.test1").getString(msg)
这种做法存在两个缺点。第一,你必须显式地指定(在你的应用程序中直接编写代码)资源包的名字(resources.test1)。在使用资源包的类的数量增长时会令程序变得很复杂。其次,标准的ResourceBundle类只提供了两种数据存储方式:文件(PropertyResourceBundle)或类(ListResourceBundle)。如果你想要从其它地方获取资源(例如数据库或FTP服务器)则必须创建自己的ResourceBundle 类。实际上,你完全可以通过从头使用定制ResourceBundle 类的方式避免这些问题。下面就让我们看看创建定制ResourceBundle类的过程。

创建自己的ResourceBundle
首先你必须创建一个类保存你要用到的所有资源包。清单A显示的就是这样的类。

该程序清单最重要的地方就是getBundle()方法,该方法返回CommonResourceBundle。返回的这个对象知道从哪里以及如何获取特定的资源。然后你可以如下所示获得局部化数据:
String localizedMsg = CommonResourceBundle.getBundle().getString(msg)

注意,你并没有指定资源包的名字。实际上,这里的技巧是在使用资源以前先把资源包加到CommonResourceBundle中来。你则可以借助addResourceBundle()方法或者采用配置文件的形式完成这项工作。

在CommonResourceBundle扩展了标准ResourceBundle的同时,你仍然可以用常规的技术获得一个局部化对象:CommonResourceBundle.getBundle("resources.test1").getString(msg)

为了实现你自己的定制ResourceBundle,你必须重载标准的ResourceBundle。实际上是重载getKeys ()和handleGetObject (String s )这两个方法。后者在检索所有可用资源包之后返回对应给定键值的对象,否则返回NULL。可用资源包是正是那些添加到CommonResourceBundle的资源包。
创建了保存所有将要使用的资源包的CommonResourceBundle之后,你现在可以创建定制的ResourceBundle类根据特定的地址和指定的格式访问局部化的资源。举个例子,我们创建一个DBResourceBundle类,这个类的作用是从数据库获得局部化对象。清单B所示为程序代码。

buildProperties () 方法从数据库获取资源并缓冲到java.util包的Properties。这个方法只能在DBResourceBundle对象实例化期间被调用。handleGetObject () 方法返回在Properties中找到的一个资源对象;如果找不到对象则返回NULL。


配置你的资源包
在你能使用CommonResourceBundle以前先得对其进行配置。我们先前曾经提到过,你可以通过调用addResourceBundle (...) 方法或设置配置文件文件的方式实现以上目前。下面的示例就为CommonResourceBundle添加了两个资源包:标准的资源包和定制的ResourceBundles:

CommonResourceBundle.addResourceBundle(ResourceBundle.getBundle("resources.test1")); CommonResourceBundle.addResourceBundle(new DbResourceBundle("jdbc:oracle:thin:scott/tiger@mypc:1521:ORCL:table:ScottProp"));

你还可以通过设置配置参数的方式达到同样的目的,也就是说,把它们加到系统性质(调用System.setProperty (...))或采用XML配置文件。以下就是FileResourceBundle和DBResourceBundle配置参数的示例:

file.resource.bundle.name=resources.test1,resources.test2

db.resource.bundle.name=jdbc:oracle:thin:scott/tiger@ppc35:1521:ORCL:table:ScottProp

第1个参数包含了一个用逗号分隔的资源文件或者类名列表。然后按照每个名字创建相应的ResourceBundle并被加入CommonResourceBundle。第2个参数包含数据库URL和数据表名(ScottProp)的列表。数据表有两列(键和值)并包含了局部化资源。针对每个URL还会创建相应的Properties并从数据库中装载数据。

以上就是创建自己的定制ResourceBundle的全过程。你可以通过阅读标准的ResourceBundle规范获取更多有关信息,同时还可以从Sun网站了解其用途的简单细节。本文示例的完整程序代码请见清单C。

清单C:http://builder.com.com/utils/sidebar.jhtml?id=u00220020430gcn02.htm&index=3
清单B:http://builder.com.com/utils/sidebar.jhtml?id=u00220020430gcn02.htm&index=2
清单A:http://builder.com.com/utils/sidebar.jhtml?id=u00220020430gcn02.htm&index=1