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使用反射就足够了:

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

我正在考虑使用反射检查所有成员字段是否都是最终的就足够了

它不会。

如果成员字段是对数组或集合的最终引用怎么办。你怎么知道数组/集合是否是对象状态的一部分(按设计)?

问题是 Java 语言无法说明设计对象的概念边界在哪里……所以没有什么可以反思性地询问。

一个更好的主意可能是依靠代码的客户端使用自定义注释“声明”类是有状态或无状态的。

于 2012-05-12T06:58:55.227 回答