Java 方法命名约定:getters 太多

为什么 Java 方法名称如此广泛地使用“get”前缀?至少在我的Java程序中,有很多方法的名称以“get”开头。获取方法的百分比可能很高。我开始觉得,由于通货膨胀,“得到”这个词正在失去它的含义。这是我的代码中的噪音。

我注意到在函数式/声明式编程和PL / SQL中使用了不同的命名约定。方法名称仅说明方法返回的内容。而不是 或 他们将使用 和 。这对我来说非常有意义,因为函数的名称描述了评估方法的结果(假设没有副作用,无论如何都不应该有副作用)。“get”前缀似乎是多余的。account.getAmount()Time.getIsoFormattedDateString(Date date)account.amount()Time.isoFormattedDateString(Date date)

我刚刚开始阅读“清洁代码”一书。它说方法应该只做一件事,并且该事情通常应该是以下之一:

  1. 通知某个对象有关事件的信息,通常将事件作为参数传递。
  2. 询问有关某个对象的问题,通常方法名称形成自然语言语句,将对象作为参数传递并返回布尔值。
  3. 获取一些东西,可能传递一些查找键或一些要转换为参数的对象,并始终返回所需的对象/值。

我的问题是关于第三类。对于这种方法,是否有除“get”以外的命名约定?选择方法名称/前缀时使用什么条件?

下面是一个示例:

我有一个具有两种方法和. 只需返回私有变量(对日期集合的引用)的值。据我所知,这是一个标准的获取器。 是不同的;它调用 ,从另一个类中获取过滤器,应用过滤器并返回实际上是 的子集。getDates()getSpecialDates()getDates()getSpecialDates()getDates()getDates()

getSpecialDates() 方法可以命名为 、 、 或其他名称。或者我可以简单地命名它。然后,为了保持一致性,我可以重命名为.computeSpecialDates()findSpecialDates()selectSpecialDates()elicitSpecialDates()specialDates()getDates()dates()

为什么要费心区分应该以“get”为前缀的方法和不应该以“get”为前缀的方法,为什么要费心寻找“get”的替代单词呢?


答案 1

我个人在可能的情况下不使用 getter 和 setter(意思是:我不使用任何需要它的框架,比如 Struts)。

如果可能的话,我更喜欢编写不可变对象(公共最终字段),否则我只使用公共字段:更少的样板代码,更高的生产力,更少的副作用。get/set的原始理由是封装(让你的对象尽可能害羞),但实际上,我并不经常需要它。

Effective Java 中,Joshua Bloch 提出了这个令人信服的建议:

类应该是不可变的,除非有很好的理由使它们可变...如果类不能设置为不可变,请尽可能限制其可变性。

在同一本书中,他还说(但我不想在这里复制整本书):

JavaBeans 模式有严重的缺点。

我完全同意这一点,因为JavaBeans最初是针对一个非常狭窄的问题领域:在IDE中操作图形组件。使用一种旨在解决另一个问题的解决方案是一种不好的做法。


答案 2

它来自JavaBeans命名约定