代码之家  ›  专栏  ›  技术社区  ›  Pops Atula

JavaBeans的设计是如何利用信息隐藏的?

  •  2
  • Pops Atula  · 技术社区  · 15 年前

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

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

    现在,我觉得这是对的。但是,不包括这些类型的setter/getter是创建JavaBeans的核心部分吗?如果是,为什么?如果不是,我对爪哇人有什么误解?

    4 回复  |  直到 15 年前
        1
  •  1
  •   JRL    15 年前

    在JavaBean类中不需要吸收器和设置器。所需要的只是类必须是公共的,它必须有一个公共的无参数构造函数,并且必须实现可序列化。但是,为了在使用bean时自动发现变量,必须按照标准命名约定(getvarname、setvarname…)提供getter和setter。

    在任何情况下,您都希望使外部可见的变量只有在类外部看到业务的变量。

        2
  •  1
  •   Grant Wagner    15 年前

    你可能想读 Why getter and setter methods are evil :

    你可能会反对说,“但是 关于JavaBeans?”他们呢?你 当然可以在没有JavaBeans的情况下 getter和setter。这个 BeanCustomizer , BeanInfo ,和 BeanDescriptor 类都存在于 正是这个目的。JavaBean 规范设计者抛出了getter/setter 因为他们 以为这是一个简单的方法 快做一个你能做的豆子 在你学习如何做的时候做 正确的。不幸的是,没有人这样做。

    访问器是作为一种 标记某些属性, UI生成器程序或等效程序可以 识别它们。你不应该这样做 你自己叫这些方法。他们 存在以供自动工具使用。 此工具使用内省API 在 Class 类以查找方法 并推断出 方法的某些属性 名字。实际上,这个 自省成语没有 算出了。它使代码变得非常强大 太复杂和程序化了。 不懂数据的程序员 抽象实际上调用 存取器,因此, 代码的可维护性较低。

        3
  •  0
  •   leeeroy    15 年前

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

        4
  •  0
  •   SingleShot    15 年前

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

    如果你有 BankAccount 用A类 balance 实例变量,为它创建getter和setter,如果希望能够检查和设置平衡,那么这是有意义的。

    即使在这里也有信息隐藏——以封装实现的形式。“吸气剂” double getBalance() “如果基础实例变量是 double 或者它可以返回从 BigDecimal 如果这是变量的实现选项,或者它可以调用远程Web服务并返回结果。因此,getter/setter仍然允许实现发生变化,因此不会违反封装(通过扩展,JavaBean也不会违反)。

    JavaBeans为您做的是定义一个接口( getXXX(), setXXX() )对于获取和设置“属性”,用户通常希望检查或更改类的属性。如果您的类具有不被视为“属性”的信息,则不需要公开它。例如,假设 银行帐户 类有一个用于验证撤消的实例变量。如果客户机不需要访问或修改这个,那么为它创建getter或setter是没有意义的。

    推荐文章