3

この目標を達成するための最も魅力的な方法は何だろうと考えていました。

私はブラックボックスを持っています。を与えると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);
    }
}
4

1 に答える 1

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

于 2013-09-12T14:48:19.467 に答える