为什么Java Bean需要访问器?

时间:2011-06-08 21:09:16

标签: java javabeans accessor

拜托,不要试图用所有“唯一的访问者是正确的”谈话杀了我......我安静地来了:)

我只想问,主要的原因是Java Beans必须使用访问器,即使在只需要简单的属性访问的情况下也是如此。在某些情况下,我知道存取器是好事。但是,正如我最喜欢的文章所说,“不要使用访问器,除非你100%确定你需要的不仅仅是简单的属性访问,否则它们会浪费CPU和程序员时间。”

再次,请不要因为不使用访问器而攻击我。我只问,为了使用和创建适当的Java Bean,它是什么原因。为什么Oracle的人说让我们这样做...谢谢。

6 个答案:

答案 0 :(得分:3)

Java bean是一种惯例。与Java bean一起使用的框架依赖于该约定的细节来可靠地操纵对象。

维基百科实际上有一个很好的解释:http://en.wikipedia.org/wiki/JavaBean

答案 1 :(得分:2)

使用访问器的主要原因是它可以在一个地方完全控制其修改。

  • 例如,假设您有一个通过类引用返回的集合,在这种情况下很难跟踪何时将某些内容添加到集合中。一个好的做法是始终在getter方法中返回集合的副本
  • 另一种用法是仅具有只读属性,我不是在谈论最终变量,而是只读外部世界并严格控制内部世界(当对映射到的实体进行操作时非常有用)数据库视图)
  • 用于单元测试,它可用于模拟(检查setter invokation couter)
  • 您可能始终创建代理对象,这允许我们提供一些额外的逻辑,如一些验证或数据更正
  • 在创建JPA实体时,我更喜欢JPA提供程序初始化的字段注入和客户端逻辑的属性初始化 - 但这是我的主观意见
  • 在调试时,有时候在setter上放置断点以查看某些属性的神奇变化是非常有帮助
  • 当合同内部的类内部结构发生变化时(存取方法)保持不变
  • 以懒惰方式初始化某些属性

我可以找到更多原因...... :)

IMHO使用访问器和mutator作为一种方法,使我们的代码更具可扩展性和灵活性

答案 2 :(得分:1)

实际上,如果Java bean遵循约定,那么它就是 bean

  • 该类必须具有无参数的公共默认构造函数。
  • 必须使用get,set,is访问类属性。如果您愿意,可以使用访问者。
  • 该类应该是可序列化的。

source

所以这只是约定 ...

的问题

答案 3 :(得分:1)

虽然这是原始Java Bean的要求,但按照惯例,值得注意的是,许多支持“bean”的库也将公共字段视为有效的访问者;并且通常还允许使用注释来指定非公共方法和字段。 这包括JAXB(用于XML-to-POJO数据绑定)和Jackson(JSON-to-POJO)等库。

因此,在某些方面,原始的Java bean'规范'(JDK javadocs中记录的约定)不再是那么相关了。

我认为大会的原作者只是觉得直接现场访问不是一个好习惯。 我个人认为有些情况下简单的不可变结构类很好,而且必须为getter(或者是可变的setter)编写猴子代码是非常愚蠢的。但是“Java结构”(只是数据,没有逻辑或者最多很少)和“真实”对象(状态和行为)之间存在着细微差别。

答案 4 :(得分:0)

如果您需要隐藏属性的详细信息,那么您将需要访问者。例如,有一个计算值(比如balanceDue),它是从另外两个实际属性(比如信用卡和借记卡)计算出来的,那么你可以在你的访问器中有代码进行计算。否则,您将需要在调用各个字段的每个客户端中进行计算。这是一个从逻辑的角度来看访问者有意义的例子。基本上,封装。

答案 5 :(得分:0)

通过使用访问器,您可以在获取/设置值时应用逻辑。它将bean与应用程序的其余部分隔离开来。

如果你需要改变bean的内部存储,你可以这样做,并且仍然保持相同的getter / settes。

例如:如果你有一个用于存储ip地址的类,你可能不会将它存储为Long值而不是String(为了效率)。您只需对一个类进行更改即可完成此操作。

另请查看GRASP,尤其是Information Expert