getters和setters的意义是什么?

2022-08-31 12:31:29

可能重复:
为什么使用 getter 和 setter?

我读过关于Java的书,说为和等变量创建 setter 和 getter 是件好事。例如:xy

public int getX(){
    return x;
}

public void setX(int x){
    this.x = x;
}

但是,这与这有什么区别,并且

...(shape.x)...   // Basically getX()

shape.x = 90;    // Basically setX()

如果二传手和二传手更好,会出现什么实际问题?


答案 1

多种原因:

  • 如果您允许字段访问,例如

    shape.x = 90

则以后无法添加任何逻辑来验证数据。

比如说,如果x不能小于100,你就不能这样做,但是如果你有像

public void setShapeValue(int shapeValue){
  if(shapeValue < 100){
    //do something here like throw exception.
  }
}
  • 不能在写入逻辑上添加类似 copy 之类的内容(请参阅 CopyOnWriteArrayList)
  • 另一个原因是访问类外的字段,您必须将它们标记为公共,受保护或默认,因此您失去了控制。当数据与类分解封装和一般的OOPS方法非常内部时。

虽然对于常量,如

public final String SOMETHING = "SOMETHING";

您将允许字段访问,因为它们无法更改,例如变量,您将将它们与getters,setters一起放置。

  • 另一种情况是,当您希望类是不可变的时,如果您允许字段访问,那么您将破坏类的不可变性,因为可以更改值。但是,如果您仔细设计带有 getter 而没有 setter 的类,那么您将保持不变性不变。

虽然在这种情况下,你必须小心getter方法,以确保你不会给出对象的引用(如果你的类有对象作为实例)。

我们可以使用 getter 和 setter 在任何包中使用私有变量。


答案 2

使用 getter 和 setter 函数允许约束和封装。假设 x 是半径。shape.x = -10 没有多大意义。此外,如果有人尝试设置非法值,您可以打印错误、设置默认值或不执行任何操作。

最好将成员变量设为私有,这样使用它们的程序就无法直接修改它们。

突变体函数
封装


推荐