在java中,为什么将setter和getter都设置为public是不好的?

Bal*_*i_R 1 java

请考虑以下Java代码:

public class SomeClass{  
    private int data;  
    public void setData(int data){  
        this.data = data;  
    }  
    public int getData(){  
        return this.data;  
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Edw*_*rzo 7

为什么吸毒者和塞特犬?

很多人想知道为什么我们需要Java中的访问器和mutator方法(又名getter和setter),为什么我们不能直接访问数据呢?但这里封装的目的不是隐藏数据本身,而是隐藏有关如何操作这些数据的实现细节.因此,我们想要的是一种提供公共接口的方法,通过该接口我们可以访问这些数据.我们以后可以在不影响类的公共接口的情况下更改数据的内部表示.相反,通过暴露数据本身,我们会破坏封装,因此,在不影响其用户的情况下,改变将来操纵此数据的方式的能力.我们将使用数据本身创建依赖项,而不是使用类的公共接口.当"改变"终于找到我们时,我们将创造一个完美的鸡尾酒.

我们可能希望封装对字段的访问有几个令人信服的理由.我发现的这些原因的最佳纲要在Joshua Bloch的书" Effective Java"中有所描述.在第14项:最小化类和成员的可访问性,他提到了几个原因,我在这里提到:

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

但是,了解封装不仅仅是隐藏字段非常重要.在Java中,我们可以隐藏整个类,这样就隐藏了整个API的实现细节.

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