为什么我需要使用setter而不是getter来设置数据?

时间:2017-04-23 22:58:13

标签: java getter-setter

假设我有一个类,其字段之一是对象SampleData,以及字段的getter和setter。

public class someClass
{
    private SampleData sampleData;

    public SampleData getSampleData()
    {
         return sampleData;
    }

    public void setSampleData( SampleData sampleData )
    {
        this.sampleData = sampleData;
    }
} 

说我已经实例化了someClass。假设我有另一个SampleData已经可用。所以使用setter我会做以下事情,

someClassInstantiated.setSampleData( anotherSampleData ); 

为什么我需要使用setter setSampleData来设置此字段的值?  为什么我不能这样做呢?

SampleData sampleData = someClassInstantiated.getSampleData();
sampleData = anotherSampleData;

3 个答案:

答案 0 :(得分:4)

人们似乎忘记了Java仍然使用内存指针来引用数据,它只是隐藏了C / C ++所具有的所有令人敬畏的指针算法;)

所以,基本上,当你执行此操作SampleData sampleData = someClassInstantiated.getSampleData();时,sampleData指向与someClassInstantiated.sampleData相同的内存位置,例如......

Initial State

然而,当您执行sampleData = anotherSampleData;时,您更改sampleData指向的内容位置与anotherSampleData相同,这不会影响someClassInstantiated.sampleData指向,它保持不变

Updated State

  

因此,如果我指向包含数据的位置,那么为什么为null?如果我在使用getter方法后打印sampleData和anotherSampleData,则sampleData为null而anotherSampleData不为null,但是从你所说的它们指向同一位置

这是因为someClassInstantiated.sampleData仍然指向null - 这是在实例化时(基于您的示例)未分配的默认值。

从长远来看,你真的,真的不希望它以你试图使用它的方式工作,因为它违反了封装原则,其中对象负责管理数据。 / p>

答案 1 :(得分:1)

在java中你有引用。平等运算符(=)用于指定reference variable以引用Object

假设someClassInstantiated.getSampleData()返回ObjectA。这是与之相同的对象 private SampleData sampleData;

SampleData sampleData = someClassInstantiated.getSampleData(); 

目前sampleData指的是ObjectA

还可以假设anotherSampleData指的是ObjectB

sampleData = anotherSampleData;

现在sampleData指的是ObjectB。现在,这对private SampleData sampleData;引用的对象没有任何影响,它仍然引用ObjectA

只有当SampleData的对象是可变的然后使用.点运算符时,如果状态被修改,则相同的修改状态将通过读取对象的状态来反映出来。参考变量。等式运算符只是指定变量以引用对象(或原始类型值)

答案 2 :(得分:0)

当你写:

SampleData sampleData = someClassInstantiated.getSampleData();
sampleData = anotherSampleData;

在第一行中您引用someClassInstantiated字段,但是此字段不引用您的对象sampleData,因此更改它不会更改someClassInstantiated

中的值

换句话说,这些对象没有绑定在一起。如果您希望在某些其他值更改时更改字段的值,请使用例如observer design pattern