【发布时间】:2010-11-30 19:31:31
【问题描述】:
我想知道是否可以就设计这个的好方法获得一些意见。我会提出我的方法,但我认为有更好的解决方案(因此问题:))。
我想创建一个枚举(以明确选项并避免单例架构),它具有用于从另一个对象创建一个对象的访问器。但是这些对象是非常灵活的。
将其视为一种限制此转换选项数量的方法。
让我稍微介绍一下层次结构。如果我要从一组不同的对象变成这样的对象:
class Base {...}
class ValueA extends Base {...}
class ValueB extends Base {...}
我正在考虑做这样的事情:
public enum ValueTransformer{
VALUE_A{
@Override
public <T> T createVo (Class<T> expectedRtn, Object obj) {
ValueA retObj = null;
if (expectedRtn == getReturnType ()) {
if (obj != null && CanBeTranslatedToA.class == obj.getClass ()) {
retObj = new ValueA ();
/*...*/
}
}
return retObj;
}
@Override
public Class<ValueA> getReturnType () { return ValueA.class; }
},
VALUE_B {
@Override
public Class<ValueB> getReturnType () { return ValueB.class; }
@Override
public <T> T createVo (Class<T> expectedRtn, Object obj) {
ValueB retObj = null;
if (expectedRtn == getReturnType ()) {
if (obj != null && CanBeTranslatedToB.class == obj.getClass ()) {
retObj = new ValueB ();
/*...*/
} else if (obj != null && AnotherClassForB.class = obj.getClass ()){
retObj = new ValueB();
/* ... */
}
}
return retObj;
}
};
public abstract <T> Class<T> getReturnType ();
public abstract <T> T createVo (Class<T> expectedRtn, Object obj);
}
这是一个不错的设计吗?这个枚举可能会增长,并且可以创建的 ValueA 和 ValueB 可能会改变(随着系统的增长)。在所有这些情况下,我都可以返回一个“Base”,但它需要一个演员表和一个检查。我宁愿没有那个。
我有必要拥有 expectedRtn 参数吗?我应该使用泛型吗?我对 Java 还很陌生,所以我并不总是确定处理这种情况的最佳方法。
感谢您的任何提示!!!!
【问题讨论】:
-
你能给出一个代码示例来说明如何使用这些枚举值吗?
-
很抱歉,但这看起来像是过度设计。既然调用者需要知道“预期的返回类型”,他不妨强制转换一下。
-
进行演员阵容会更好吗?我认为选角是一个很大的问题。有点天生危险。我很容易出错。这样做意味着开发人员仍然必须知道他们在做什么,但他们无法判断他们是否错了。强制错误的演员阵容是很有可能的,对吧?