原创作者: 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关于这个强制转换的信息。
 
  1. public static void contributeTypeCoercer(Configuration<CoercionTuple> configuration)   
  2.    {   
  3.      Coercion<BigDecimal, Money> coercion = new Coercion<BigDecimal, Money>()   
  4.      {   
  5.        public Money coerce(BigDecimal input)   
  6.        {   
  7.          return new Money(input);   
  8.        }   
  9.      };   
  10.         
  11.      configuration.add(new CoercionTuple<BigDecimal, Money>(BigDecimal.class, Money.class, coercion));        
  12.    }   
  13.     
 此外,因为TypeCoercer知道如何强制转换Double到BigDecimal,或者由Integer到BigDecimal(到Long到Double),所有这些强制转换都能很好的工作。
 
当从null创建一个强制转换时,使用Void.cass作为源类型。例如,内建的强制转换从null到Boolean是这样实现的:
  1. configuration.add(new CoercionTuple(void.class, Boolean.class,   
  2.        new Coercion<Void, Boolean>()   
  3.        {   
  4.            public Boolean coerce(Void input)   
  5.            {   
  6.                return false;   
  7.            }   
  8.        }));  
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

文章信息

Global site tag (gtag.js) - Google Analytics