【问题标题】:A Question on Encapsulation关于封装的问题
【发布时间】:2010-05-12 20:31:11
【问题描述】:

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

谢谢

【问题讨论】:

    标签: java oop encapsulation


    【解决方案1】:

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

    【讨论】:

    • 任何想出应该公开的非静态、非最终数据的好例子的人都会得到我的投票。
    • bill,我使用 Java 框架 PulpCore 开发了一个小程序形式的游戏,在这个框架中,精灵的数据确实可以公开访问,例如 mySprite.alpha.set( 255);
    • @Peter:这看起来像是一个 setter 方法调用。
    • 永远没有理由公开属性。
    • @Helper,直接分配给成员避免了函数调用的开销,尽管很小,但可以导致更快的运行代码(尤其是在紧密循环中),这可能是应用程序的一个重要目标(例如图形),对吧?无论如何,我总的来说同意,必须有一个很好的(即可衡量的)理由来放弃间接二传手的安全性和灵活性,但说“永远不会”似乎很极端......
    【解决方案2】:

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

    回答你的问题,你为什么要实现封装?这样你就可以控制对你类的内部成员的访问。例如,如果您有一个整数字段,您只想将其设置为 1 到 10 范围内的值。如果您直接公开整数字段,则没有机制可以防止消费者设置超出您所需范围的值。但是,您可以通过封装通过 setter 或属性公开您的内部 int 字段来实现此目的,从而允许您在 setter 或属性中添加验证代码以“监管”为您的内部字段设置的值。

    享受吧!

    【讨论】:

    • C# 具有专门用于此目的的“属性”。它们基本上是方法,但用途更窄,例如提供对私有数据成员的公共访问、验证或在读取/写入数据成员时应用一些其他业务逻辑。 msdn.microsoft.com/en-us/library/w86s7x04.aspx
    【解决方案3】:

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

    【讨论】:

    • 第一,他对封装的定义不是“正确的”,然后真正的 OO 通过传递消息来工作。然后,封装的重点是向向其发送消息的“对象”隐藏类的功能内部工作。公共价值,即使是最终的,完全违背了封装的目的,因此不是“封装”。对于某些人来说,它可能有它的用途,但是拥有 Java public final 成员绝对不是封装,无论您对 OO 的定义还是封装的定义。
    • 嗯?你能用英语说吗?隐藏不可变数据有什么意义?不管你的教科书怎么说,你能给我一个充分的理由吗?
    • @artic 简而言之:如果您公开任何成员字段,您就不能谈论封装。如果您对任何公共 final 字段进行更改,客户端代码(即使用您的类的其他类)可能会中断。
    • 如果您阅读我的评论,您会发现我说的是“不可变”值。
    • 通过更改我的意思是例如将一个属性的类型更改为另一个。如果您公开这些字段,那么您就无法在不破坏某人代码的情况下做到这一点。
    【解决方案4】:

    差不多 - 如果您认为一个对象具有状态,那么现在任何人都可以在您不知情的情况下修改您的对象的状态。至少使用 setter 方法可以更好地控制对象的状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      相关资源
      最近更新 更多