在我的CS课程中,我只是在学习课程和OOP。
因此,当您创建一个类时,您会初始化一定数量的私有变量。
我知道你将它们设为私有,因为如果它们是公开的,它们很容易改变,并且可能导致很多错误。
因此我们使用get和set方法来更改变量。但这又一次使变量很容易改变吗?那么最初是将它们变为私有的呢?
答案 0 :(得分:4)
使用getter和setter(称为encapsulation
或 data-hiding
)的一些好处:
<强> 1。类的字段可以是只读的(仅通过提供getter)或只写(仅通过提供setter)。这使班级能够完全控制谁可以访问/修改其字段。
示例:
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
。
答案 1 :(得分:1)
正如上面的评论所述,getter和setter封装(即隐藏)类的内部细节。因此,与您交互的其他类不需要了解实现细节。
例如,在您描述的简单情况下,实例变量通过getter和setter公开。但是,如果您想要更改类以便不再使用实例变量,而是将值保存到磁盘,该怎么办?您可以在不影响班级用户的情况下对您的班级进行此更改。
请记住,无需始终提供getter和setter。如果您不希望您的班级提供设置或阅读这些属性的方法,那么请不要这样做。只需将它们设为私有。
答案 2 :(得分:0)
get用于获取属性的值,set用于将值赋给属性 例如:
private int variable;
public int getVariable(){
return variable;
}
public void setVariable(int aux){
variable=aux;
}
通常,用于封装属性。
参考:
答案 3 :(得分:0)
封装或数据隐藏使您可以更好地控制可以为字段设置的值。如果您不希望类属性具有负值,则可以使用以下示例:
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);
}
}
答案 4 :(得分:0)
获取和设置方法优于&#34; public&#34;变量,因为它们将类的用户与内部更改隔离开来。
假设你有一个变量&#34; StockQty&#34;并且你把它公之于众,因为这似乎是最简单的事情。
稍后您将获得用户要求跟踪库存历史。您现在需要实现SetStockQty()方法,以便在设置新数量之前保存旧数量。
现在,您班级的所有用户都必须更改代码,重新记录并重新测试。
如果您只使用SetStockQty()方法,则需要更改并测试代码。
第二个原因是你可以让没有Setters的Getters有效地制作变量&#34;只读#34;。
答案 5 :(得分:0)
传统上,它们在封装方面是合理的。通过提供对类的字段进行读写的调节访问,我们认为可以减少耦合。
用更简单的语言:通过控制其他类可以读取和更改数据的方式,我们减少了类的数据可以改变的方式。这意味着减少了类之间的连接,从而降低了复杂性。
然而,同样的逻辑说,除非确实需要吸气剂和固定剂,否则通常应该避免使用吸气剂和固定剂,而且很少需要这样做。在大多数情况下,一个班级应该“倾向于自己编织” - 如果要对这个类的数据进行计算,它应该这样做。如果应该更改一个值,它应该进行更改。
例如,考虑一个空间中的对象。它的位置指定为(x,y,z)。我们可能允许其他类只是随意设置它们 - 这显然是可怕的,但是对于这些更好的设置器并不明显。你真正想要的是一个构造函数来设置初始位置,然后是影响该位置的方法 - 例如,记录一个影响或加速。然后你正在做OO编程。
答案 6 :(得分:0)
一句话,Encapsulation.setters还允许您控制如何在程序中输入值。像我这样的许多新程序员经常对这个概念感到困惑。我强烈建议你阅读this SO question
答案 7 :(得分:0)
客观:这是最好的实践!!!
1)如有必要,请使用get方法公开您的属性。 2)如有必要,允许使用set方法修改属性(状态修改);
没有处理的公共get和set方法与public的属性相同。