比如 我的类为public class SomeClass
{
   private SomeClass2 m_member;   public SomeClass2 getMember()
   {
      return m_member;
   }
}在这里, getMember传回去的应该是指针吧, 如果我不想让别人可以更改 m_Member所封装的任何值SomeClass2 instance = someClass.getMember();
instance.changeValue();
我该怎么办那? 除了 return m_Member.clone();
这类似于C++ 
  public:
     SomeClass2 getMember() const;或者
C#
  public readonly SomeClass2 getMember();请各位大侠赐教:D

解决方案 »

  1.   

    final 不是不允许子类override这个方法么?
      

  2.   

    如果你不想改变m_member引用的对象,那么将m_member声明为final就可以了;看你的意思是不想改变m_member里面的值,那么就只有在SomeClass2的定义里面做文章了;例如将SomeClass2的成员定义为final,或者使用一些模式也可以实现。
      

  3.   

    对method 而言 final 是不允许override的意思,对field而言就是相当于定义该field为常量。但是我觉得即使把reference类型变量m_meber定义为final也不能实现你保护该对象内部数据的目标,因为这只是表明这个reference变量是常数,而不是它refer的object中封装的数据就不能被改变了。我觉得你应该考虑用为SomeClass2类的method设置恰当的access specifier(e.g protected )来实现保护封装数据的目的。
      

  4.   

    楼上的见解很接近了,大体来说,你用方法返回的是成员引用,只要那个引用的对象提高了更改其内部状态的方法,你就休想把他设为不可更改的对象,所以,你要做的是修改对象的类型,考虑继承或聚合修改对象的可访问接口。
    以下引用lz的代码:
    public class SomeClass
    {
       private SomeClass2 m_member;   public SomeClass2 getMember()
       {
          return m_member;
       }
    }在这里, getMember传回去的应该是指针吧, 如果我不想让别人可以更改 m_Member所封装的任何值SomeClass2 instance = someClass.getMember();
    instance.changeValue();你能做的,不是将someClass.getMember()作什么处理,而是对SomeClass2进行修改,让它不具备changeValue()的方法。