原创作者: chinajavawolf
阅读:910次
评论:0条
更新时间:2011-05-26
本人翻译目的是用来学习Tapestry5的,共享出来希望大家批评指正。计划持续翻译。
chinajavawolf
类型强制
Tapestry 常常必需强制转换对象的类型。通过强制,我们能转换某些类型的对象为有相似内容的不同类型的新对象:一个常用的例子是强制转换一个string为integer或double。
尽管这些强制转换类型常发生在tapestry-core内(包括强制转换组件参数),这也发生在tapestry-ioc内,比如在一个构建器方法内注入一个值要优于注入一个服务。
在Tapestry内的相似内容,类型转换是可扩展的。根基是一个TypeCoercer服务。它的结构由许多CoercionTuples组成。每个元组(tuple)定义如何强制转换类型。强制的初始设置主要集中在不同的数字类型转换。
少数特殊的强制转换涉及到null;Object-->List 包裹一个独立对象作为一个单独的列表。随后我们需要null-->List来确保null抑制无效(null stays null),这优于一个单独的只有孤立的为null的元素列表。
Tapestry可以窜改必须的强制转换。例如,假定它必须强制转换一个StringBuffer为一个Integer;TypeCoercer将串联一系列的强制转换。
1. Object --> String
2. String --> Long
3. Long --> Integer
贡献新的强制
TypeCoercer是可扩展的,你可以添加你所希望的强制转换。例如,让我们假定你有一个Money类型描绘许多现金,并且你想要能够在BigDecimal和Money间转换。此外,让我们设想Money有一个接受一个BigDecimal参数的构造器。我们将使用少量的Tapestry IOC 配置告知TypeCoercer关于这个强制转换的信息。
- public static void contributeTypeCoercer(Configuration<CoercionTuple> configuration)
- {
- Coercion<BigDecimal, Money> coercion = new Coercion<BigDecimal, Money>()
- {
- public Money coerce(BigDecimal input)
- {
- return new Money(input);
- }
- };
- configuration.add(new CoercionTuple<BigDecimal, Money>(BigDecimal.class, Money.class, coercion));
- }
此外,因为TypeCoercer知道如何强制转换Double到BigDecimal,或者由Integer到BigDecimal(到Long到Double),所有这些强制转换都能很好的工作。
当从null创建一个强制转换时,使用Void.cass作为源类型。例如,内建的强制转换从null到Boolean是这样实现的:
- configuration.add(new CoercionTuple(void.class, Boolean.class,
- new Coercion<Void, Boolean>()
- {
- public Boolean coerce(Void input)
- {
- return false;
- }
- }));
评论 共 0 条 请登录后发表评论