2

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

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

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

4

4 回答 4

1

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

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

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

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

于 2009-09-09T18:00:19.120 回答
1

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

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

于 2009-09-09T18:01:14.220 回答
1

您可能想阅读为什么 getter 和 setter 方法是邪恶的

您可能会反对说,“但是 JavaBeans 呢?” 他们呢?您当然可以在没有 getter 和 setter 的情况下构建 JavaBean。、 和 类都是为了这个目的而存在的BeanCustomizer。JavaBean 规范设计者将getter/setter 习惯用语放入图片中,因为他们认为这是一种快速制作bean 的简单方法——在学习如何正确操作的同时,您可以做到这一点。不幸的是,没有人这样做。BeanInfoBeanDescriptor

访问器仅作为标记某些属性的一种方式而创建,以便 UI 构建器程序或等效程序可以识别它们。您不应该自己调用这些方法。它们的存在是为了使用自动化工具。该工具使用Class类中的自省 API 来查找方法并从方法名称推断某些属性的存在。在实践中,这种基于内省的习语并没有奏效。它使代码过于复杂和程序化。不了解数据抽象的程序员实际上调用了访问器,因此代码的可维护性较差。

于 2009-09-09T20:35:07.293 回答
0

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

于 2009-09-09T17:55:33.357 回答