面向对象编程中的访问修饰符

Imr*_*ran 7 c++ java oop computer-science programming-languages

我不理解OOP中的Access Modifiers.为什么我们在Java实例变量私有中使用,然后使用公共getter和setter方法来访问它们?我的意思是这背后的推理/逻辑是什么?

您仍然可以访问实例变量但是为什么在可以公开变量时使用setter和getter方法?

请原谅我的无知,因为我只是想了解为什么?

先感谢您.;-)

Tho*_*mas 11

这称为数据或信息隐藏.

基本上,你不希望用户(阅读:其他程序员或你自己)在你的课程内部戳,因为这使得改变事情变得非常困难.

另一方面,界面和实现之间的清晰分离(理论上)使得在内部更改内容变得容易,而不会影响任何类的用户.

例如,假设我有一个Buttonpublic String text字段的控件.现在每个人都开始使用我的Button,但我意识到每当文本改变时,按钮实际上应该在屏幕上重新绘制.我运气不好,因为我的对象无法检测到何时text被分配.如果我做了它private并提供了一个setText()代替,我可以添加一个重绘调用该setter方法.

另一个例子,假设我有一些类在其构造函数中打开一个文件并将其分配给一个public FileStream file.如果无法打开文件,构造函数将引发异常.因此,类中的其他方法可以假定该字段始终有效.但是,如果有人在我的课堂上闲逛并设置filenull,我班上的所有方法都会突然崩溃.


Mic*_*rdt 6

一个常常被忽视很重要的一点:你没有提供一个getter和每一个领域的二传手!实际上,大多数字段既不应该也不应该只有一个getter(使它们实际上是只读的).

拥有除私有属性和公共getter和setter之外的其他类的类与使用公共字段一样糟糕.这是一种称为贫血领域模型的反模式.关键是getter和setter允许你向模型添加行为和逻辑,而不是简单地保存数据 - 在许多情况下,这意味着没有getter或setter(或两者).

  • 不,它不像使用公共领域那么糟糕.我和两个人一起工作过,发现有吸气剂和安装者可以提供更大的灵活性.设计一个类仍然是一种非常糟糕的方式,但是用公共数据成员编写任何真正的类都要糟糕得多. (2认同)