我想知道实现这一目标最吸引人的方式是什么。
我有一个黑盒子。我给它一个supported type
,它返回一个类型的随机值。
对于我支持的类型,我的enum
定义如下:
public enum Types
{
INTEGER,
DOUBLE,
BIGINTEGER,
BIGDECIMAL,
STRING,
BOOLEAN,
CHAR
}
我认为最简单的方法是创建一个静态函数,它返回一个基于Type
的对象
public static Object getRandomValue(Types type)
{
switch(type)
{
case INTEGER:
return randomInt();
case DOUBLE:
return randomDouble();
case BIGINTEGER:
return randomBigInt();
case BIGDECIMAL:
return randomBigDecimal();
case STRING:
return randomString();
case BOOLEAN:
return randomBool();
case CHAR:
return randomChar();
}
}
问题是,每次我想根据此方法检索随机值时,都必须进行额外的强制转换。
我已经研究过设计模式abstract factory
和factory
,我无法确定实现其中任何一个是否有优势。或者,如果有不同的设计模式似乎更合适。
假设我的所有random
方法都已定义。
以下是客户端的示例:
public abstract class MyClass<T>
{
protected T t;
}
public class MyIntClass extends MyClass<Integer>
{
public MyIntClass()
{
t = getRandomValue(Types.Integer);
}
}
答案 0 :(得分:3)
这样的事情:
public <T> T getRandom(Class<? super T> type);
您可以将类型映射到enum
或使用Map<Class<?>, Supplier<?>>
。我会使用地图,因为代码就是:
public <T> T getRandom(Class<? super T> type){
return (T) myMap.get(Type).get();
}
您可能需要执行一些递归工作,以允许super
方面允许int
和Integer
使用同一个供应商。