[英]Access modifiers in Object-Oriented Programming
我不理解OOP中的Access Modifiers。 为什么我们在Java实例变量私有中使用,然后使用公共getter和setter方法来访问它们? 我的意思是这背后的推理/逻辑是什么?
您仍然可以访问实例变量但是为什么在可以公开变量时使用setter和getter方法?
请原谅我的无知,因为我只是想了解为什么?
先感谢您。 ;-)
这称为数据或信息隐藏 。
基本上,你不希望用户(阅读:其他程序员或你自己)在你的课程内部戳,因为这使得改变事情变得非常困难。
另一方面,界面和实现之间的清晰分离(理论上)使得在内部更改内容变得容易,而不会影响您的类的任何用户。
例如,假设我有一个带有public String text
字段的Button
控件。 现在每个人都开始使用我的Button
,但我意识到每当文本发生变化时,按钮实际上应该重新绘制在屏幕上。 我运气不好,因为我的对象无法检测何时分配text
。 如果我将其设为private
并提供了setText()
,我可以添加一个重绘调用该setter方法。
作为另一个例子,假设我有一些类在其构造函数中打开文件并将其分配给public FileStream file
。 如果无法打开文件,构造函数将引发异常。 因此,类中的其他方法可以假定该字段始终有效。 但是,如果有人在我的课程中进行探讨并将file
设置为null
,那么我班级中的所有方法都会突然崩溃。
不同之处在于,使用getter和setter可以控制实例字段的访问方式。 您可以提供防御性副本,不可变视图,甚至是实例字段的转换。 您已隐藏其他人的真实实施细节。 这是好事!
你越是隐藏,同时仍然使你的界面友好和有用,越好。 其他人不需要知道事情是如何运作的(因为他们可能会想做他们不应该做的事情); 他们只需要知道事情以某种方式发挥作用。
另一点是封装 - 如果您选择更改处理此变量的方式,例如总是返回/存储副本,您可以在一个地方(getter / setter)执行此操作而不会破坏任何内容。
如果您的类是不可变的,那么将变量公开为公共变量没有任何错误。 (所有都将是公共决赛)并且没有规则getter应该总是返回变量。或者setter应该将变量设置为..你可以围绕你的私有变量访问环绕大量的规则/修饰符等(数据封装)
首先,并非所有数据成员都应该拥有getter和setter,我想你可以看到保持这些变量私有的优点。
第二,大多数类不仅仅是随机的数据集合。 它们代表了你应该能够独立推理的事情。 通常,这意味着它们具有开发人员可以依赖的某些属性(通常称为“类不变量”)。 例如,Rectangle类应该具有以下属性:在角点之间绘制线条会产生彼此成直角的线条。 如果这些点是公共数据成员,那么任何随机应用程序都可以更改一个点,然后你就会得到一个不是矩形的矩形。 如果你有一个setter函数,你可以正确处理它。
第三,考虑维护。 在某些时候,您可能想要修改类实现,您可能想知道有多少事情需要改变。 如果数据成员是公共的,则更改实现的任何细节都可能会破坏使用该类的任何程序。 你被困住了。 如果有getter和setter,你可以补偿它,所以设置一个值可以在内部做一些或多或少复杂的事情,以获得与以前相同的效果。 如果您有更抽象的成员函数,那么进行更改时几乎没有问题。
您将类成员变量设为私有,以控制您可能无法控制的其他代码可以访问和操作它们的方式。
如果您只是编写玩具代码,看到这一点可能会很棘手,但是当您编写其他人将使用和依赖的代码时,您就会理解。
举一个简单的例子说,一个类成员变量永远不会设置为null很重要 - 比如它会破坏你的类。 如果您将该字段设为公共,则任何其他代码都可以将该变量设置为null,您无能为力。
如果将其设为私有并改为提供setter方法,则可以保护成员不被设置为null,是否可以控制是否抛出已选中/未选中的异常,或者是否忽略该尝试。
这些是使用OOP,多态,继承和封装的主要优点。
封装允许您使用私有访问修饰符隐藏对象上的实现或数据。
另一方面,您希望改变数据,从而创建setter方法。 希望这可以帮助。
你在谈论OOP基础知识。 这个主题值得读一本好书。 不同的博客和论坛(其中一个是SO)不适合获取基础知识。
如果您真的想要深入了解对优秀开发人员至关重要的基础知识,那么请阅读相关书籍。 “代码完成”或“面向对象的分析”值得阅读。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.