我正在实现一个对象缓存:
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?
答案 0 :(得分:2)
你正在尝试做什么(检测任意对象的可变性),我认为不能做到。即使它可以,通过一些反思性的杂技,它仍然是一个坏主意。
如果您控制ProcessingStrategy
接口或其实现者,也许您可以使用方法isStateless()
或子接口StatelessProcessingStrategy
,这些方法按惯例可在请求之间共享。< / p>
答案 1 :(得分:2)
我在考虑检查所有成员字段是否最终使用反射就足够了
不会。
如果成员字段是对数组或集合的最终引用,该怎么办?如何判断数组/集合是否是对象状态的一部分(按设计)?
问题是Java语言没有办法说出设计对象的概念边界在哪里......所以没有什么可以反思地插入。
更好的想法可能是依靠代码的客户端使用自定义注释“声明”类是有状态的或无状态的。