在java中,为什么将setter和getter都设置为公共字段是不好的?

在java中,为什么将setter和getter都设置为公共字段是不好的?,java,Java,考虑以下Java代码: 公共类SomeClass{ 私有int数据; 公共void setData(int data){ 这个数据=数据; } public int getData(){ 返回此.data; } } 在上面的代码中,数据的值可以从任何地方访问。那么为什么不将字段数据公开呢?因为您可以控制其他类如何设置数据 您可以对输入执行检查,甚至可以根据您可能拥有的某些规则修改输入 例如: public class SomeClass{ private int data; pub

考虑以下Java代码:

公共类SomeClass{
私有int数据;
公共void setData(int data){
这个数据=数据;
}  
public int getData(){
返回此.data;
}
}

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

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

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

例如:

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;  
}
公共类SomeClass{
私有int数据;
公共void setData(int data){
如果(数据<1000){
这个数据=数据;
}
否则{
数据=-1;
}
}  
public int getData(){
返回此.data;
}

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

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

例如:

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;  
}
公共类SomeClass{
私有int数据;
公共void setData(int data){
如果(数据<1000){
这个数据=数据;
}
否则{
数据=-1;
}
}  
public int getData(){
返回此.data;
}

}为什么是能手和二传手

许多人想知道为什么我们需要Java中的访问器和变异器方法(又称getter和setter),为什么我们不能直接访问数据?但是这里封装的目的不是隐藏数据本身,而是关于如何操作数据的实现细节。所以,我们想要的再次是提供一个公共接口的方法,通过它我们可以访问这些数据。我们以后可以在不影响类的公共接口的情况下更改数据的内部表示。相反,通过公开数据本身,我们损害了封装,因此也损害了将来在不影响其用户的情况下改变操作这些数据的方式的能力。我们将创建与数据本身的依赖关系,而不是与类的公共接口的依赖关系。当“改变”最终找到我们时,我们将为麻烦制造一杯完美的鸡尾酒

我们可能希望封装对字段的访问,有几个令人信服的原因。约书亚·布洛赫(Joshua Bloch)的书中描述了我所发现的这些理由的最好概要。在第14项:最小化类和成员的可访问性中,他提到了几个原因,我在这里提到:

  • 您可以限制可存储在字段中的值(即性别必须为F或M)
  • 您可以在修改字段时采取操作(触发事件、验证等)
  • 您可以通过同步该方法来提供线程安全性
  • 您可以切换到新的数据表示形式(即计算字段、不同的数据类型)
  • 可以将字段设置为只读
  • 等等
然而,理解封装不仅仅是隐藏字段是非常重要的。在Java中,我们可以隐藏整个类,从而隐藏整个API的实现细节


通过阅读艾伦·斯奈德(Alan Snyder)的一篇名为《我向所有读者推荐》的伟大文章,我对这一重要概念的理解得到了扩展和充实。

为什么是“能者”和“二传者”

许多人想知道为什么我们需要Java中的访问器和变异器方法(又称getter和setter),为什么我们不能直接访问数据?但是这里封装的目的不是隐藏数据本身,而是关于如何操作数据的实现细节。所以,我们想要的再次是提供一个公共接口的方法,通过它我们可以访问这些数据。我们以后可以在不影响类的公共接口的情况下更改数据的内部表示。相反,通过公开数据本身,我们损害了封装,因此也损害了将来在不影响其用户的情况下改变操作这些数据的方式的能力。我们将创建与数据本身的依赖关系,而不是与类的公共接口的依赖关系。当“改变”最终找到我们时,我们将为麻烦制造一杯完美的鸡尾酒

我们可能希望封装对字段的访问,有几个令人信服的原因。约书亚·布洛赫(Joshua Bloch)的书中描述了我所发现的这些理由的最好概要。在第14项:最小化类和成员的可访问性中,他提到了几个原因,我在这里提到:

  • 您可以限制可存储在字段中的值(即性别必须为F或M)
  • 您可以在修改字段时采取操作(触发事件、验证等)
  • 您可以通过同步该方法来提供线程安全性
  • 您可以切换到新的数据表示形式(即计算字段、不同的数据类型)
  • 可以将字段设置为只读
  • 等等
然而,理解封装不仅仅是隐藏字段是非常重要的。在Java中,我们可以隐藏整个类,从而隐藏整个API的实现细节


通过阅读艾伦·斯奈德(Alan Snyder)的一篇名为《我向所有读者推荐》的伟大文章,我对这一重要概念的理解得到了扩展和充实。

有时情况要求某些变量只能用于读或写目的。您可以通过getter和setter方法实现它。 如果将该变量公开,则可以访问该变量,并可以使用类对象更改其值。 这种类型的模式称为POJO<代码>POJO是普通旧Java对象的首字母缩略词。该名称用于强调给定对象是普通Java对象,而不是特殊对象。


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

有时情况要求某些变量可以访问以进行读写操作