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

Why do I need to use a setter - instead of a getter - to set data?

假设我有一个 class,它的字段之一是一个对象,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;

当你写:

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

在第一行中您引用了 someClassInstantiated 的字段,但是该字段不引用您的对象 sampleData,因此更改它不会更改 someClassInstantiated[=14 中的值=]

也就是说,这些对象并没有绑定在一起。如果您想在其他值发生变化时更改字段的值,请使用例如observer design pattern.

在 java 中您有参考资料。相等运算符 (=) 用于分配 reference variable 来引用 Object

让我们假设 someClassInstantiated.getSampleData() returns ObjectA。这与 private SampleData sampleData;

SampleData sampleData = someClassInstantiated.getSampleData(); 

目前sampleData指的是ObjectA

还假设 anotherSampleData 指的是 ObjectB

sampleData = anotherSampleData;

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

仅当 SampleData 的对象是可变的,然后使用 . 点运算符,如果状态被修改,相同的修改状态将通过读取对象的状态 y 任一引用变量来反映.相等运算符简单地分配变量以引用一个对象(或原始类型值)

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

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

但是,当您执行 sampleData = anotherSampleData; 时,您将 sampleData 指向的内存位置更改为与 anotherSampleData 相同,这不会影响 [=12] =] 指向,保持不变

So if I point to a location that contains data, then why null? If I print both the sampleData and anotherSampleData after using the getter method, sampleData is null and anotherSampleData is not null, but from what you are saying they are pointing to the same location

这是因为 someClassInstantiated.sampleData 仍然指向 null - 这是实例化时分配给它的默认值,并且(根据您的示例)尚未更改。

在长 运行 中,您真的非常不希望它按照您尝试使用它的方式工作,因为它打破了封装原则,其中对象负责数据管理。