2017-04-23 30 views
-2

假设我有一个类,它的一个字段中包含一个对象SampleData,以及该字段的getter和setter。为什么我需要使用setter(而不是getter)来设置数据?

public class someClass 
{ 
    private SampleData sampleData; 

    public SampleData getSampleData() 
    { 
     return sampleData; 
    } 

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

说我已经实例化了someClass。假设我已有另一个SampleData可用。因此,与二传手我会做以下,

someClassInstantiated.setSampleData(anotherSampleData); 

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

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

这取决于你想要实现什么...... – noobcoder

+0

你试过了吗? 'SampleData sampleData = someClassInstantiated.getSampleData();'说,“将'sampleData'指向与'getSampleData'返回结果相同的位置,然后'sampleData = anotherSampleData;''说'将sampleData'指向'anotherSampleData'” - 这不会改变'someClassInstantiated.sampleData'指向的内容 – MadProgrammer

+1

getter和setter的全部用途是,如果没有对象控制它的完成方式,外部实体不能修改对象的内部状态。 – Tibrogargan

回答

4

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

所以,基本上,当你这样做SampleData sampleData = someClassInstantiated.getSampleData();sampleData指向与someClassInstantiated.sampleData相同的内存位置,例如...

Initial State

如何过,当你做sampleData = anotherSampleData;,您更改sampleData指向是一样anotherSampleData存储位置,这并不影响什么someClassInstantiated.sampleData指向,它仍然保持不变

Updated State

所以,如果我指向一个包含数据的位置,那为什么是空?如果我使用的getter方法后打印两个的sampleData和anotherSampleData,sampleData在为空并且anotherSampleData不为空,但是从你说的话,他们都指向同一个位置

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

从长远来看,您确实不希望它按照您尝试使用它的方式工作,因为它打破了封装原则,对象负责管理数据。

0

当你写:

SampleData sampleData = someClassInstantiated.getSampleData(); 
sampleData = anotherSampleData; 
在你正在参照的 someClassInstantiated领域的第一线

,但是这个领域并不是指你的对象的sampleData,从而改变它不会改变值在someClassInstantiated

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

1

在java中你有参考。平等运营商(=)用于指定reference variable以引用Object

让我们假设someClassInstantiated.getSampleData()返回ObjectA。这是相同的对象称为由 private SampleData sampleData;

​​

目前sampleDataObjectA

也让我们假设anotherSampleData是指ObjectB

sampleData = anotherSampleData; 

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

仅当SampleData的对象是可变的,然后使用.点运算符时,如果状态被修改,则通过读取对象的状态y参考变量之一来反映相同的修改状态。平等运算符简单地分配变量来引用一个对象(或基本类型值)

相关问题