检测对象是存储状态还是可以共享

时间:2012-05-12 03:38:18

标签: java caching reflection reference

我正在实现一个对象缓存:

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?

2 个答案:

答案 0 :(得分:2)

你正在尝试做什么(检测任意对象的可变性),我认为不能做到。即使它可以,通过一些反思性的杂技,它仍然是一个坏主意。

如果您控制ProcessingStrategy接口或其实现者,也许您可​​以使用方法isStateless()或子接口StatelessProcessingStrategy,这些方法按惯​​例可在请求之间共享。< / p>

答案 1 :(得分:2)

  

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

不会。

如果成员字段是对数组或集合的最终引用,该怎么办?如何判断数组/集合是否是对象状态的一部分(按设计)?

问题是Java语言没有办法说出设计对象的概念边界在哪里......所以没有什么可以反思地插入。

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