日期:2014-05-20  浏览次数:20728 次

请问Java中有类似于C++中的const么?
比如   我的类为

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



------解决方案--------------------
final
------解决方案--------------------
如果你不想改变m_member引用的对象,那么将m_member声明为final就可以了;

看你的意思是不想改变m_member里面的值,那么就只有在SomeClass2的定义里面做文章了;

例如将SomeClass2的成员定义为final,或者使用一些模式也可以实现。
------解决方案--------------------
对method 而言 final 是不允许override的意思,对field而言就是相当于定义该field为常量。但是我觉得即使把reference类型变量m_meber定义为final也不能实现你保护该对象内部数据的目标,因为这只是表明这个reference变量是常数,而不是它refer的object中封装的数据就不能被改变了。我觉得你应该考虑用为SomeClass2类的method设置恰当的access specifier(e.g protected )来实现保护封装数据的目的。
------解决方案--------------------
楼上的见解很接近了,大体来说,你用方法返回的是成员引用,只要那个引用的对象提高了更改其内部状态的方法,你就休想把他设为不可更改的对象,所以,你要做的是修改对象的类型,考虑继承或聚合修改对象的可访问接口。
以下引用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()的方法。