在PropertyResourceBundles中引入继承

PropertyResourceBundle 是一种 Java 机制,用于从实际的 Java 代码中分离出特定于语言环境的文本。当应用程序调用这些特定于语言环境的其中一个属性时,与给定的用户语言环境相关的一个文本文件就被打开并被阅读。

从 Java 代码中分离出对语言环境敏感的消息是处理国际化问题的关键。只要应用程序使用 PropertyResourceBundle 来获取它特定于语言环境的属性,就可以通过为所有受支持的语言环境提供属性文本文件而将应用程序很容易地翻译成任何语言。

维护大量的资源束会是一项十分艰巨的任务 ― 就象努力维护一大段代码一样令人生畏。那么为什么不应用一些在代码中使用的原理来促进资源束的重用呢?

本文的重点是为 PropertyResourceBundle 引入继承概念。以这种方式,公共束就可以被共享,而可以在不影响其它的束用户的前提下,引入更多特定的束。

首先,我将概括地叙述一下最普遍使用的设计策略。

当前的策略及它们的问题

当前使用 PropertyResourceBundle 的设计通常遵循以下三个策略:

使用一个大的、囊括一切的束(所有应用程序组件都共享这个束)。

允许每一个应用程序组件拥有自己独立的束,这些束不在应用程序间重用。

允许一些不具有重复属性定义的资源束。

让我们更详细地看一下其中的每一种策略:

单束:不重用,维护代价高

第一种方法在有关设计时和运行时的资源束上都有很大的争议。它并不支持重用,因为只存在一个束且对该束所做的任何更改都会影响到使用该束的其它组件。

这种方法中的任何属性的重新定义都要求所有组件使用新版本,或者添加一个新属性。无论如何,维护大量资源束会很快变得很吃力,而且消耗的时间比您所希望的要多。

更小的,独立的束:不重用,使问题一致

第一种方法的另一种选择是将单资源束分裂成原始束的一些子集。这种方法将使每一个束独立于其它束;允许每一个束重新定义属性以供自己使用。

这种设计不支持重用,因为每一个束都必须定义它自己的属性。而且每一个束在其定义中都保留独立性。

各个束之间保持一致现在变得更困难,因为每一个束都是独立的。比如每一个束可能都定义一个带有邮件地址的属性。如果这个地址现在发生了更改,每一个与此邮件地址有关的束都必须改变。

特定于属性的束:维护的高代价转向代码

第三种方法依赖于代码开发人员要明确了解给定任何属性时要转向哪一个资源束。

使用邮件地址属性示例(其中地址属性只在一个资源束中定义)时,任何需要包含地址的应用程序组件都必须转到定义地址的特定资源束。在这种模式下,应用程序组件必须确定给定一个键时,要转到哪一个资源束。对资源束所做的任何更改都可能要求对使用它们的应用程序组件进行类似的更改。

使用这种方法时,维护问题真的刚好从资源束转到获取属性的代码上了。

为了寻求一个有效的解决方案,我们需要在这三种方法中权衡利弊。

时间: 2024-11-02 00:51:26

在PropertyResourceBundles中引入继承的相关文章

在nanowar中引入AOP

通过nanocontainer的nanowar和其struts插件完美的实现了IoC模式的透明,但无法在标准的nanowar中引入nanoaop不得不说是一种遗憾.看了一下nanocontainer的代码,决定自己动手给nanowar添加aop的支持.要在组件和实例中支持AOP,首先要引入interceptor chains.可以考虑在XML定义中引入<aspect interceptor='InterceptorName' pointcuts='Filter'/>标签.这个<aspec

在JavaScript中实现继承

javascript|继承 JavaScript脚本语言是一种功能强大的面向对象的语言.本文描述了如何在JavaScript中实现继承. Prototype JavaScript没有实现类继承,但可以通过prototype实现.每个JavaScript类中都包含一个prototype对象,当访问一个对象的属性和方法时,它首先从当前对象查找,如果该属性在JavaScript类定义,则直接访问:否则,从类的prototype对象中查找,如果找到则直接访问,否则从prototype的prototype

在网页XHTML文件中引入CSS样式五种方式

css|xhtml|网页 XHTML文件是通过CSS样式进行显示的控制的,也就是结合XHTML与CSS来表现页面内容.那么到底有哪些方式在XHTML文件中引入CSS样式呢? 一.使用STYLE属性 将STYLE属性直接加在个别的元件标签里,<元件(标签) STYLE="性质(属性)1: 设定值1; 性质(属性)2: 设定值2; ...} 例如: <td style="color:#c00; font-size:15px; line-height:18px;> 网页教学

C++中如何在容器中使用继承和虚函数

容器不支持混合类型, 如果直接把派生类对象, 存入基类容器中, 则无法使用派生-基转换(derived-base conversion); 因为转换只能发生在指针和引用 过程中, 不能发生在 对象直接赋值, 如果是直接转换, 则会产生截断(sliced down); 即派生类部分被切除, 只留下基类部分; 所以存入容器中的派生类 输出为基类部分 的虚函数; 如果想在容器中, 进行继承, 则需要使用指针, 包括智能指针(如:shared_ptr<>), 则会输出派生类的覆写(override)版

ORM中的继承关系映射全解——单表继承体系、一实体一具体表、一实体一扩展表

ORM中的继承关系映射全解--单表继承体系.一实体一具体表.一实体一扩展表.接口映射 本文涉及的内容包括: 1.单表继承体系 2.一实体一具体表 3.一实体一扩展表 4.接口实现映射vs基类继承映射 1.单表继承体系 所谓单表继承体系就是用一张数据库表存储整个继承体系中的所有实体的数据.单表继承体系适合那种继承体系中实体数目相对较少,总记录数相对较少,子类对父类的属性扩展也相对较少的情形. 单表继承体系优点是读/写继承体系中的每个实体的数据,都只需操作一张表,性能较好,并且,新增继承类,或扩展实

JavaScript中的继承方式详解

 这篇文章主要介绍了JavaScript中的继承方式详解,本文讲解了js继承的概念.原型式继承与类式继承.原型链继承.类式继承.组合继承.原型式继承等内容,需要的朋友可以参考下     js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现继承,可以用js的原型prototype机制或者用apply和call方法去实现 在面向对象的语言中,我们使用类来

JAVA学习(六):JAVA中的继承及其常见问题分析

JAVA中的继承及其常见问题分析 1.JAVA中继承的定义 JAVA中,类的继承是通过扩展其他类而形成新类来实现的,原来的类称为父类(Super Class)或基类,新的类称为原来类的子类或派生类.在子类中,不仅包含了父类的属性和方法,还可以增加新的属性和方法,从而使得父类的基本特征可被所有子类对象共享. 注:类的继承并不改变类成员的访问权限,也就是说,如果父类的成员是公有的.被保护的或默认的,它的子类仍具有相应的这些特性. /**********************************

关于Java中的继承和组合的一个错误使用的例子

关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚,论证不清晰,欢迎大家留言指正. 什么是「组合」和「继承」 假设有2个class:A和B: 如果class A extends B 那么我们就说A继承B,A是子类,B是父类,这种情况就是继承. 如果A中有一个属性的类型为B,那么我们就说这种情况就是组合. 分别在什么情况下使用 回想一些我们一般会在什么情况下考虑这

C++工程中引入levelDB

      操作系统:ubuntu       IDE:eclipse       最近一直在读一本书,叫做innodb存储引擎;对数据库有了新的认识,再加上一直关注着ssdb的作者的进展,所以也想搞一个自己的数据库:显然现在的hashmap类型的nosql数据库被大家用烂了,自己想搞一个关系型的内存数据库:不过再开始之前还是现了解下leveldb吧.       首先在github上把源代码下载下来,并且解压:打开eclipse,创建C++ hello world工程:创建levelDB so