cxz7531
2008-09-22 09:17
这两天仔细修改了,给每个对象添加了唯一不变的globalId。取得对象引用的时候都用get(String globalId),只在一个地方保留引用,别的地方只记录globalId。当get(globalId)返回为空就清除之。

有些人的习惯是一个对象保持多处引用,这种方式虽然运行效率高些,但维护会很麻烦。

如果只在一处保留引用,别处只保留globalId,用get方法或者工厂返回引用,返回后的引用不保留,用完就扔。 这种方式扩展性较好

---------------------------

但这种办法的效率有点问题,原来多出保留引用可以直接用,现在每次都要从list或者hash表中查找,效率低。如果是一般业务软件无所谓,碰上图形软件就麻烦了。

fox0424
2008-09-22 09:33
可以考虑使用智能指针类似的实现方式。内部维护一个计数器,每次引用计数器自动加一,每次删除计数器自动减一,当计数器为0的时候,自己删除自己。每处的引用必须要负责释放,程序看起来也会清晰很多。而且不会因为一个地方删除而导致其他地方出现错误的问题。

cxz7531
2008-09-22 10:28
可以考虑使用智能指针类似的实现方式。内部维护一个计数器,每次引用计数器自动加一,每次删除计数器自动减一,当计数器为0的时候,自己删除自己。每处的引用必须要负责释放,程序看起来也会清晰很多。而且不会因为一个地方删除而导致其他地方出现错误的问题。

------------------------------

这倒是一个办法。

在对象里添加一个方法setNull(),在=null之前先执行

abayi
2009-01-09 20:38
可以考虑使用 代理模式。

所有的对象都通过代理来解决。

                  代理1控制引用生效周期
Object Ref 1 --------| ---- Real Protected Object
Object2 Ref 2--------|

<p>

[该贴被abayi于2009-01-09 20:39修改过]

bloodrate
2009-01-15 09:32
十分希望java api(System类)里能提供返回所有系统内对象(数组)的方法,也能查看每个对象都在那个方法里引用的路径..

猜你喜欢