两个学期前,我有一位教授说:
有些人被告知要始终为所有私有实例变量包含setter和getter方法。我说这会破坏信息隐藏,并且经常会导致无法强制执行不变量的系统。
现在,这对我来说是对的。但是不包括那些类型的setter / getters是创建JavaBeans的核心部分吗?如果是这样,为什么?如果没有,我对JavaBeans的误解是什么?
答案 0 :(得分:1)
Java Bean类中不需要getter和setter。所有必需的是该类必须是公共的,它必须具有公共无参数构造函数,并且它必须实现Serializable。但是,为了在使用bean时自动发现变量,必须按照标准命名约定(getVarname,setVarname ...)提供getter和setter。
在任何情况下,您都希望只在外部看到在您的课程外面看到业务的变量。
答案 1 :(得分:1)
您可能需要阅读Why getter and setter methods are evil:
你可能会反对说,“但是什么 关于JavaBeans?“他们怎么样?你 当然可以不用构建JavaBeans 吸气剂和二传手。该
BeanCustomizer
,BeanInfo
和。{ 所有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是没有意义的。