3

オブジェクトキャッシュを実装しています:

void cache(String request_type, String request_id, ProcessingStrategy request_strategy) 
{ 
    if (no_state(request_strategy) == true)
       map.put(request_type, request_strategy);
    else
       map.put(request_id, request_strategy); //no chance of keyspace collision
}

ProcessingStrategy lookup(String request_type, String request_id)
{
    ProcessingStrategy request_strategy = map.get(request_type);
    if (request_strategy == null) return map.get(request_id)
    else return request_strategy;
}

interface ProcessingStrategy特定のタイプのすべての要求にわたって実装されるオブジェクトを共有するこのスキームは、具象クラスに格納されている状態がない場合にのみ機能します。

no_stateメソッドを作成するにはどうすればよいですか?

finalすべてのメンバーフィールドがReflectionを使用しているかどうかを確認するだけで十分だと思います。

for(Field f : request_strategy.getClass().getDeclaredFields())
    if(!Modifier.isFinal(f.getModifiers()))
        return false;
//even if all fields are final;
//how to check that they are not being initialized with differently in the ProcessingStrategy constructor?
4

2 に答える 2

2

あなたがやろうとしていること(任意のオブジェクトの可変性を検出すること)、私はできないと思います。たとえそれができたとしても、いくつかの反射的なアクロバットを通して、それはまだ悪い考えのようです。

インターフェイスまたはその実装者を制御する場合ProcessingStrategyは、メソッドisStateless()、、、またはサブインターフェイスを使用できますStatelessProcessingStrategy。これらは、慣例により、要求間で共有できます。

于 2012-05-12T04:07:56.587 に答える
2

すべてのメンバーフィールドがReflectionを使用して最終的なものであるかどうかを確認するだけで十分だと思います

そうではありません。

メンバーフィールドが配列またはコレクションへの最終参照である場合はどうなりますか。配列/コレクションが(設計上)オブジェクト状態の一部であるかどうかをどのように判断できますか?

問題は、Java言語では、設計オブジェクトの概念的な境界がどこにあるかを判断する方法がないことです。したがって、反射的に対話することはできません。

より良いアイデアは、カスタムアノテーションを使用して、クラスがステートフルまたは非ステートフルであることを「宣言」するためにコードのクライアントに依存することです。

于 2012-05-12T06:58:55.227 に答える