Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于封装的一个问题_Java_Oop_Encapsulation - Fatal编程技术网

Java 关于封装的一个问题

Java 关于封装的一个问题,java,oop,encapsulation,Java,Oop,Encapsulation,我知道封装是将成员及其行为绑定到一个实体中。这让我觉得成员们必须是私人的。这是否意味着具有公共成员的类未遵循100%封装规则 谢谢正确。类中的数据/状态不应公开,除非它是最终值。非常-如果您认为对象具有状态,现在任何人都可以在您不知道的情况下修改对象的状态。至少通过setter方法,您可以更好地控制对象的状态。封装既是数据绑定又是数据隐藏。Java允许您公开数据,但如果您选择这样做,您应该有一个很好的理由。默认情况下,成员变量应该是私有的,并且只有在绝对必要的情况下才提升到更高的可见性。这意味着

我知道封装是将成员及其行为绑定到一个实体中。这让我觉得成员们必须是私人的。这是否意味着具有公共成员的类未遵循100%封装规则


谢谢

正确。类中的数据/状态不应公开,除非它是最终值。

非常-如果您认为对象具有状态,现在任何人都可以在您不知道的情况下修改对象的状态。至少通过setter方法,您可以更好地控制对象的状态。

封装既是数据绑定又是数据隐藏。Java允许您公开数据,但如果您选择这样做,您应该有一个很好的理由。默认情况下,成员变量应该是私有的,并且只有在绝对必要的情况下才提升到更高的可见性。

这意味着内部字段(您要封装在类中的字段)应该是私有的,并且只能通过getter、setter和,隐藏和绑定类的内部成员,并通过特定框架java(getters setters)、.net(properties)等中提供的方法控制访问,这就是封装

为了回答您的问题,为什么要实现封装?好吧,这样您就可以控制对类内部成员的访问。例如,如果您有一个整型字段,您只希望将其设置为1-10范围内的值。如果直接公开integer字段,则没有任何机制阻止使用者将值设置在所需范围之外。但是,您可以通过封装实现这一点,方法是通过setter或属性公开内部int字段,从而允许您在setter或属性中添加验证代码,以“监控”内部字段中设置的值


享受吧

任何提出一个非静态、非最终数据的好例子的人都会得到我的投票。比尔,我与Java框架、PulpCore合作开发了一个小程序形式的游戏,在这个框架中,精灵确实可以公开访问他们的数据,例如mySprite.alpha.set(255)@彼得:这看起来像是一个setter方法调用。从来没有理由公开属性。@Helper,直接分配给一个成员可以避免函数调用的开销,虽然很小,但可以导致更快的代码运行(特别是在紧循环中),这可能是应用程序的一个重要目标(例如图形),对吗?总之,总的来说,我同意,放弃间接设置器的安全性和灵活性肯定有一个很好的(即可测量的)理由,但是说“永远”似乎是极端的……首先,他的封装定义不“正确”,然后真正的OO通过传递消息来工作。然后,封装的要点是对向其发送消息的“对象”隐藏类的函数内部工作。公共价值,甚至是最终的,完全违背了封装的目的,因此不是“封装”。对于一些人来说,它可能有它的用途,但是拥有一个Java公共最终成员绝对不是封装,不管你对OO的定义是什么,也不管你对封装的定义是什么?你能用英语说吗?隐藏不可变数据有什么意义?不管你的教科书怎么说,你能给我一个很好的理由吗?@简而言之:如果你公开任何成员字段,你就不能说封装。如果您对任何公共final字段进行更改,客户端代码(即使用您的类的其他类)可能会中断。如果您阅读我的注释,您将看到我说的是“不可变”值。所谓更改,我指的是将一个属性的类型更改为另一个属性。如果你公开了这些字段,你就不可能不破坏别人的代码。C#有专门用于此目的的“属性”。它们基本上是方法,但使用范围更窄,例如提供对私有数据成员的公共访问、验证,或者在读取/写入数据成员时应用一些其他业务逻辑。