根据类型检索随机值的方法

时间:2013-09-12 14:46:03

标签: java design-patterns

我想知道实现这一目标最吸引人的方式是什么。

我有一个黑盒子。我给它一个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 factoryfactory,我无法确定实现其中任何一个是否有优势。或者,如果有不同的设计模式似乎更合适。

假设我的所有random方法都已定义。

以下是客户端的示例:

public abstract class MyClass<T>
{
    protected T t;
}

public class MyIntClass extends MyClass<Integer>
{
    public MyIntClass()
    {
        t = getRandomValue(Types.Integer);
    }
}

1 个答案:

答案 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方面允许intInteger使用同一个供应商。