以“get”和“set”开头的Java非属性访问器方法?

时间:2013-12-28 18:53:26

标签: java properties naming-conventions

在开创性的书The Elements of Java Style中,它说:

  

遵循JavaBeans约定来命名属性访问器方法。 JavaBeans规范建立了标准命名   允许访问a属性的方法的约定   JavaBean实现。您应该在何时应用这些约定   在任何类中命名方法,无论它是否实现了   豆。

在创建简单(无副作用)属性访问器时,我们的项目遵循is/get/set的此规则。但我的问题是 - 使用get和set启动其他方法会让人感到困惑吗?

例如,假设我有一个方法调用外部系统来获取全局序列中的下一个数字。是否将此方法getNextId()命名为不良做法?

我会这么认为,因为它让我认为nextId是序列对象的属性,而实际上并非如此。我认为更好的名称是nextId()fetchNextIdFromExternalSystem()

这里的最佳做法是什么? is/get/set是否应仅限于属性访问者?

1 个答案:

答案 0 :(得分:6)

Getters不必专门映射到支持字段。他们只需按照他们所说的去做:返回一个以某种方式包含在该类中的值。

这没有说明该值的存储方式。这可以直接通过支持字段,也可以通过集合中的查找,甚至可以在幕后将其外包给某种数据提供者。

所有这些都是封装的另一个方面。它屏蔽了外部世界价值的内部表征。

使用它的任何人都清楚该方法的作用:它返回下一个ID。如何确定此ID对调用者没用,他不关心它是作为特定字段保存还是需要在某处查找。

您检索一个值。调用者不关心如何存储它,他只是想要值。 getNextId()是可接受的名称。

很难找到一个直截了当的官方指南,但我认为它有点是Java naming conventionsJavaBean conventions的组合。

更具体地说:

  

方法

     

方法应该是动词,在第一个字母小写的大小写混合的情况下,每个内部单词的首字母大写。

     

run(); runFast(); getBackground();

  

如果bean具有遵循这些模式的访问器方法

,则bean定义类型为T的属性p      

吸气剂

     

public T getP()

它没有指定这是否应该专门映射到一个支持字段,它只是确定它应该如何构造。通过命名方法nextID(),我发现了两个问题:

  1. “使用动词”的准则不予尊重
  2. 存在歧义:我们是否希望获取下一个ID,或者某种方法应该以某种方式排列下一个ID?
  3. 我意识到你不应该仅从一个库中获取指南并在下一个库中应用它,但我不能说我到目前为止已经看到它做了不同的事情并且使用获得 - 前缀。