代码之家  ›  专栏  ›  技术社区  ›  C. Ross trotttrotttrott

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

oop
  •  4
  • C. Ross trotttrotttrott  · 技术社区  · 15 年前

    我正在编写一个类,它有两个对象作为私有成员,其中一个在概念上由类引用,另一个在概念上由类拥有。然而,代码本身并没有给出这种情况的线索。

    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 回复  |  直到 14 年前
        1
  •  3
  •   CesarGon    15 年前

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

    然而,在诸如Java或C语言等语言中,这种解决方案通常是不可用的。据我所知,大多数现代OO编程语言不区分拥有的对象和引用的对象;这是一个在概念建模级别上很有意义的区别,但出于某种原因编程语言选择忽略它。

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

        2
  •  1
  •   djna    15 年前

    “处置”是什么意思?你会用一些语言写

     myTidyUp() {
    
          delete _RecordSet;
          _RecordSet = null;
    
          // not owened so don't delete
          _WorkList = null;
    
     }
    

    但在垃圾收集语言中,我们只需编写代码:

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

    没有区别,拥有与否的区别在记录集的生命周期/工厂/注册表代码中。

    如果存在某种开放/关闭的生命周期需求(如JDBC连接),那么该协议由依赖对象定义。

    我的初步结论是:在垃圾收集环境中,“拥有的”对象的文档化生命周期给了我们区别。在非GC环境中,我们在需要时使用智能指针管理整理。智能指针的使用使所有权变得清晰。

        3
  •  0
  •   Owen S.    14 年前

    解决此类问题的另一种可能的方法是在变量名上使用某种前缀来区分拥有的对象和非拥有的对象,这是一种自我评价机制,尤其是在非拥有的对象上使用这种前缀。我见过这样一种被称为“app-hungarian”符号的技术。这不是一种普遍流行的技巧,但如果你发现自己在很多时候都在玩杂耍,这会有所帮助。