get和set方法有什么意义

在我的CS课程中,我只是学习课程和OOP。

因此,当您创建一个类时,您会初始化一定数量的私有变量。

我知道你把它们变成私有的,因为如果它们是公开的,它们很容易改变,并且可能导致很多错误。

所以我们使用get和set方法来改变变量。 但这又一次使变量很容易改变吗? 那么最初是将它们变为私有的呢?

使用getter和setter的一些好处(称为encapsulationdata-hiding ):

1.类的字段可以是只读的(仅提供getter)或只写(仅提供setter)。 这使class级能够完全控制谁可以访问/修改其字段。

例:

 class EncapsulationExample { private int readOnly = -1; // this value can only be read, not altered private int writeOnly = 0; // this value can only be changed, not viewed public int getReadOnly() { return readOnly; } public int setWriteOnly(int w) { writeOnly = w; } } 

2.类的用户不需要知道类实际存储数据的方式。 这意味着数据被分离并独立于用户而存在,从而允许更容易地修改和维护代码。 这允许维护人员进行频繁的更改,例如错误修复,设计和性能增强,同时不影响用户。

此外,封装的资源可以为每个用户统一访问,并且具有与用户无关的相同行为,因为此行为在类中内部定义。

示例(获取值):

 class EncapsulationExample { private int value; public int getValue() { return value; // return the value } } 

现在如果我想返回两倍的值呢? 我可以改变我的getter,使用我的示例的所有代码都不需要更改,并且将获得两倍的值:

 class EncapsulationExample { private int value; public int getValue() { return value*2; // return twice the value } } 

3.使代码更清晰,更易读,更容易理解。

这是一个例子:

没有封装:

 class Box { int widthS; // width of the side int widthT; // width of the top // other stuff } // ... Box b = new Box(); int w1 = b.widthS; // Hm... what is widthS again? int w2 = b.widthT; // Don't mistake the names. I should make sure I use the proper variable here! 

封装:

 class Box { private int widthS; // width of the side private int widthT; // width of the top public int getSideWidth() { return widthS; } public int getTopWIdth() { return widthT; } // other stuff } // ... Box b = new Box(); int w1 = b.getSideWidth(); // Ok, this one gives me the width of the side int w2 = b.getTopWidth(); // and this one gives me the width of the top. No confusion, whew! 

看看你对你得到的信息有多少控制权以及在第二个例子中有多清楚。 请注意,这个例子是微不足道的,在现实生活中,您将处理许多不同组件访问的大量资源的类。 因此,封装资源可以更清楚地了解我们正在访问哪些资源以及以何种方式(获取或设置)。

这是关于这个主题的good SO thread

这里有关于数据封装的good read

正如上面的评论所述,getter和setter封装(即隐藏)类的内部细节。 因此,与您交互的其他类不需要了解实现细节。

例如,在您描述的简单情况下,实例变量通过getter和setter公开。 但是,如果您想要更改类以便不再使用实例变量,而是将值保存到磁盘,该怎么办? 您可以对您的class级进行此更改,而不会影响您class级的用户。

请记住,不必总是提供吸气剂和固定剂。 如果您不希望您的类提供设置或读取这些属性的方法,那么请不要这样做。 只需将它们设为私有。

get用于获取属性的值,set用于将值赋给属性ex:

 private int variable; public int getVariable(){ return variable; } public void setVariable(int aux){ variable=aux; } 

通常,用于封装属性。

参考:

在java中设置和获取方法?

封装或数据隐藏使您可以更好地控制可以为字段设置的值。 如果您不希望类属性具有负值,则可以使用以下示例:

 class WithoutGetterSetter { public int age; } class WithGetterSetter { private int age; public setAge(int age) { if(age < 0) // don't set the value else this.age = age; } } public class testEncapslation { public static void main(String args[]) { WithoutGetterSetter withoutGetterSetter = new WithoutGetterSetter(); withoutGetterSetter.age = -5; WithGetterSetter withGetterSetter = new WithGetterSetter(); withGetterSetter.setAge(-5); } } 

Get和Set方法比“public”变量更可取,因为它们将类的用户与内部更改隔离开来。

假设你有一个变量“StockQty”,你把它公之于众,因为这似乎是最简单的事情。

稍后您将获得用户要求跟踪库存历史。 您现在需要实现SetStockQty()方法,以便在设置新数量之前保存旧数量。

现在,您class级的所有用户都必须更改代码,重新记录和重新测试。

如果您只使用SetStockQty()方法,则需要更改并测试代码。

第二个原因是你可以让没有Setters的Getters有效地使变量“只读”。

传统上,它们在封装方面是合理的。 通过提供读取和写入类的字段的调节访问,我们认为减少了耦合。

用更简单的语言:通过控制其他类可以读取和更改数据的方式,我们减少了类的数据可以改变的方式。 这意味着减少了类之间的连接,从而降低了复杂性。

然而,同样的逻辑说,除非确实需要吸气剂和固定剂,否则通常应该避免使用吸气剂和固定剂,而且很少需要这样做。 在大多数情况下,一个class级应该“倾向于自己编织” – 如果要对这个类的数据进行计算,它应该这样做。 如果应该更改一个值,它应该进行更改。

例如,考虑一个空间中的对象。 它的位置指定为(x,y,z)。 我们可能允许其他类只是随意设置它们 – 这显然是可怕的,但是对于这些类型的setter来说更好是不明显的。 你真正想要的是一个构造函数来设置一个初始位置,然后是影响该位置的方法 – 例如,记录一个影响或加速。 然后你正在做OO编程。

一句话,Encapsulation.setters还允许您控制如何在程序中输入值。 像我这样的许多新程序员经常对这个概念感到困惑。 我强烈建议你阅读这个问题

客观:这是关于最好的实践!

1)如有必要,使用get方法公开您的属性。 2)如有必要,允许使用set方法修改属性(状态修改);

没有处理的公共get和set方法与public属性相同。