2010-12-02 65 views
1

我使用了使用方法重载像这样JCR API:如何自动将对象引用转换为实例类型?

setProperty(String value) 
setProperty(Boolean value) 
setProperty(Integer value) 
... 

我然后有一个Collection<Object>其可含有StringBooleanInteger等实例。

我想迭代这个集合,将每个元素传递给该实例类型的正确的setProperty实现。最显而易见的方法是这样的:

for (Object value : values) { 
    if (value instanceof String) node.setProperty((String) value); 
    if (value instanceof Boolean) node.setProperty((Boolean) value); 
    if (value instanceof Integer) node.setProperty((Integer) value); 
    ... 
} 

现在,而且是丑 - 从OO理想偏离 - 这种解决方案根本没有规模。虽然它适用于这种特殊情况,但随着类型数量的增加,它很快会变得很难处理。

我真的觉得好像自动执行这个铸造操作必须有一些优雅的技巧或util。

回答

3

不,因为您要求重载决议,通常在编译时执行,而不是在执行时执行。

选项:

  • 使用反射来查找和执行方法
  • 使用visitor pattern效仿double dispatch(这可能不适合你的情况,我不喜欢为访问者模式作为很多人都是)
0

我真的觉得好像必须有一些优雅的伎俩或UTIL用于自动执行该浇铸操作。

我不认为你会找到一个。

如果您有大量的类型替代品(即20个或更多),那么在value.getClass()上执行散列表查找以为您提供某个“setter”对象的实例可能是有意义的。但是你需要编写很多样板代码......所以这不算优雅,IMO。

反射也是一种选择,但其价格昂贵并且引入了更多潜在的运行时故障模式。另外,我实际上并没有看到它在这个特殊情况下会有多大帮助。

相关问题