【问题标题】:How does the design of JavaBeans square with information hiding?JavaBeans 的设计如何与信息隐藏相匹配?
【发布时间】:2009-09-09 17:13:02
【问题描述】:

两个学期前,我有一位教授说:

有些人被告知始终为所有私有实例变量包含 setter 和 getter 方法。我说这会破坏信息隐藏,并经常导致无法强制执行不变量的系统。

现在,这对我来说是正确的。但是,包括这些类型的 setter/getter 不是创建 JavaBeans 的核心部分吗?如果是这样,为什么?如果不是,我对 JavaBeans 有什么误解?

【问题讨论】:

  • 快速回答:告诉我“JavaBeans 对所有事物都需要 getter 和 setter”的人是错误的。

标签: javabeans principles information-hiding


【解决方案1】:

Java Bean 类中不需要 Getter 和 setter。所需要的只是该类必须是公共的,它必须有一个公共的无参数构造函数,并且它必须实现 Serializable。但是,为了在使用 bean 时自动发现变量,您必须提供遵循标准命名约定(getVarname、setVarname...)的 getter 和 setter。

在任何情况下,您都希望只让在您的班级之外看到业务的变量在外部可见。

【讨论】:

    【解决方案2】:

    你的教授是对的。您不想盲目地为所有实例变量创建 getter 和 setter。您想在需要的地方创建它们。

    如果您有一个带有 balance 实例变量的 BankAccount 类,那么如果您希望能够检查和设置余额,则为其创建 getter 和 setter 是有意义的。

    即使在这里也有信息隐藏 - 以封装实现的形式。 getter "double getBalance()" 可以简单地返回底层实例变量的值,如果它是 double,或者它可以返回从 BigDecimal 派生的值,如果这是变量的实现选择,或者它可能正在调用远程 Web 服务并返回结果。因此,getter/setter 仍然允许实现变化,因此不会违反封装(并且通过扩展,JavaBeans 也不会)。

    JavaBeans 为您做的是定义一个接口 (getXXX(), setXXX()) 用于获取和设置“属性”,即用户通常想要检查或更改的类的属性。如果您的班级有不被视为“财产”的信息,则无需公开它。例如,假设BankAccount 类有一个用于验证提款的实例变量。如果客户端不需要访问或修改它,那么为它创建 getter 或 setter 是没有意义的。

    【讨论】:

      【解决方案3】:

      您可能想阅读Why getter and setter methods are evil

      你可能会反对说:“但是什么 关于 JavaBeans?” 他们呢?你 当然可以在没有的情况下构建 JavaBeans 吸气剂和二传手。这 BeanCustomizerBeanInfoBeanDescriptor 类都存在于 正是这个目的。 JavaBean 规范设计师扔了 getter/setter 成语成语,因为他们 认为这将是一个简单的方法 快速做一个豆子——你能做的 在你学习如何做的时候做 正确的。不幸的是,没有人这样做。

      访问器仅作为一种方式创建 标记某些属性,以便 UI-builder 程序或等效程序可以 识别它们。你不应该 自己调用这些方法。他们 存在以供自动化工具使用。 此工具使用自省 API 在Class 类中找到方法 并推断存在 该方法的某些属性 名字。在实践中,这 基于内省的成语没有 解决了。它极大地编写了代码 过于复杂和程序化。 不懂数据的程序员 抽象实际上称为 访问者,因此, 代码不易维护。

      【讨论】:

        【解决方案4】:

        这通常很简单,您为需要使外部可见的变量公开 setter/getter,并且您不会为其他任何业务都不知道的变量公开 setter/getter。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-07
          • 2016-09-08
          • 2014-11-08
          • 2021-07-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多