1

考虑以下 Java 代码:

public class SomeClass{  
    private int data;  
    public void setData(int data){  
        this.data = data;  
    }  
    public int getData(){  
        return this.data;  
    }
}

在上面的代码中,数据的值可以从任何地方访问。那么为什么不直接公开现场数据呢?

4

4 回答 4

7

为什么是 Getter 和 Setter?

许多人想知道为什么我们需要 Java 中的访问器和修改器方法(又名 getter 和 setter),为什么我们不能直接访问数据?但是这里封装的目的不是隐藏数据本身,而是如何操作这些数据的实现细节。因此,我们再次需要一种提供公共接口的方法,通过该接口我们可以访问这些数据。我们以后可以在不损害类的公共接口的情况下更改数据的内部表示。相反,通过暴露数据本身,我们损害了封装性,因此,在不影响其用户的情况下改变未来操作这些数据的方式的能力。我们将使用数据本身创建依赖关系,而不是使用类的公共接口。

我们可能想要封装对字段的访问有几个令人信服的原因。Joshua Bloch 的《 Effective Java》一书中描述了我所找到的关于这些原因的最佳概要。在第 14 项:最小化类和成员的可访问性中,他提到了几个原因,我在这里提到:

  • 您可以限制可以存储在字段中的值(即性别必须是 F 或 M)。
  • 您可以在修改字段时执行操作(触发事件、验证等)。
  • 您可以通过同步方法来提供线程安全。
  • 您可以切换到新的数据表示(即计算字段,不同的数据类型)
  • 您可以将字段设为只读
  • 等等。

然而,理解封装不仅仅是隐藏字段是非常重要的。在 Java 中,我们可以隐藏整个类,从而隐藏整个 API 的实现细节。

通过阅读 Alan Snyder 的一篇名为《面向对象编程语言中的封装和继承》的精彩文章,我对这个重要概念的理解得到了拓宽和丰富,我向所有读者推荐了这篇文章。

于 2013-08-19T16:06:23.873 回答
3

因为您可以控制其他类如何设置数据。

您可以对输入进行检查,甚至可以根据您可能拥有的某些规则修改输入。

例如:

public class SomeClass{  
private int data;  
public void setData(int data){  
    if (data < 1000){
        this.data = data;  
    }
    else{
        data = -1;
    }
}  
public int getData(){  
    return this.data;  
}

}

于 2013-08-19T16:04:08.897 回答
1

即使现在看起来使用 getter/setter 方法没有意义因为它们没有做任何有趣的事情,你需要考虑当需求改变时将来会发生什么。您可能会发现在设置值时需要添加一些验证;您可能会发现您需要更改整个实现,以便“get”方法实际上要从几条数据中计算一个值,或者从一个文件中读取它,或其他东西。而当这种情况发生时,如果你有其他类data直接访问,你会被搞砸的。您将无法以您需要的方式更改实现,而不会带来很多痛苦。我是根据维护他人草率代码的痛苦经历的漫长而痛苦的经历。

于 2013-08-19T16:11:33.960 回答
0

有时情况要求某些变量只能出于读取或写入目的而访问。你可以通过getter和setter方法来实现。如果您将变量设为公共,则它可以被访问并且可以使用类对象更改其值。这种类型的模式称为 POJO。POJO is an acronym for Plain Old Java Object. The name is used to emphasize that a given object is an ordinary Java Object, not a special object.

链接可以回答您的问题,并通过谷歌搜索 POJO 类的优势以获取更多信息。

于 2013-08-19T16:09:38.610 回答