JavaBeans的设计如何与信息隐藏平方?

时间:2009-09-09 17:13:02

标签: javabeans principles information-hiding

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

  

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

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

4 个答案:

答案 0 :(得分:1)

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

在任何情况下,您都希望只在外部看到在您的课程外面看到业务的变量。

答案 1 :(得分:1)

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

  

你可能会反对说,“但是什么   关于JavaBeans?“他们怎么样?你   当然可以不用构建JavaBeans   吸气剂和二传手。该   BeanCustomizerBeanInfo和。{   所有BeanDescriptor个类都存在   正是这个目的。 JavaBean   规范设计师投掷了getter / setter   成语是因为他们   认为这将是一个简单的方法   快点做一个你可以做的东西   在你学习如何做的同时做   对。不幸的是,没有人这样做。

     

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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

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