在代码中区分拥有和引用的对象?

时间:2010-06-17 14:42:24

标签: oop

我正在编写一个有两个对象作为私有成员的类,其中一个在概念上由类引用,另一个在概念上由类拥有。但是,代码本身并不能解决这种情况。

public class WorklistSearchResults
{
        //This is "owned" and will be disposed
        private RecordSet _RecordSet = null;
        private RecordSet RecordSet
        {
            //...
        }

        //This is "referenced" and won't be dispoesd
        private WorkList _WorkList = null;
        private WorkList WorkList
        {
            //...
        }
        //...   
}

是否有标准方法来区分拥有和引用的对象?评论是唯一的方式吗?

3 个答案:

答案 0 :(得分:3)

在C ++等语言中,您可以将拥有的对象嵌入到类中,并通过指针指向引用的对象。

但是,在Java或C#等语言中,通常不提供该解决方案。据我所知,大多数现代OO编程语言不区分拥有和引用的对象;这是一个在概念建模层面很有意义的差异,但由于某些原因,编程语言选择忽略它。

就个人而言,我依靠评论和模式来实现差异。

答案 1 :(得分:1)

“处置”是什么意思?在某些语言中,你会写

 myTidyUp() {

      delete _RecordSet;
      _RecordSet = null;

      // not owened so don't delete
      _WorkList = null;

 }

但是在垃圾收集语言中我们只是编码:

 myTidyUp() {      
      _RecordSet = null;
      _WorkList = null;
 }

没有区别,拥有或不区分在_RecordSet的生命周期/工厂/注册表代码中。

如果存在某种打开/关闭生命周期需求(就像我们在JDBC连接上那样),那么该协议由依赖对象定义。

我的初步结论:在垃圾收集环境中,“拥有”物体的文件生命周期给了我们区别。在非GC环境中,我们根据需要使用智能指针进行整理。智能指针的使用使得所有权变得清晰。

答案 2 :(得分:0)

这样的问题的另一种可能的技术是在变量名上使用某种前缀来区分拥有和非拥有,作为一种自我评论机制 - 特别是在非拥有对象上放置这样的前缀。我见过这种技术被称为“App匈牙利”符号。它不是一种普遍流行的技术,但如果你发现自己在很多时候都在玩杂耍,它可能有所帮助。