Java方法命名约定:太多的getter

Are*_*sby 39 java getter many-to-many naming-conventions

为什么Java方法名称如此广泛地使用"get"前缀?至少在我的Java程序也有很多与以单词"获取"名称的方法.get方法的百分比非常高.由于通货膨胀,我开始觉得"获得"这个词正在失去意义.这是我的代码中的噪音.

我注意到,有功能性/声明性编程和PL/SQL中使用不同的命名约定.方法名称只是说明方法返回的内容.而不是account.getAmount()Time.getIsoFormattedDateString(Date date)他们将使用account.amount()Time.isoFormattedDateString(Date date).这让我感觉良好,因为该函数的名称描述评估方法(假设有没有副作用,这不应该是这样)的结果."get"前缀似乎是多余的.

我刚刚开始阅读"清洁代码"一书.它说方法应该只做一件事,那件事通常应该是以下之一:

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

我的问题是关于第三类.对于这种方法,是否存在除"get"之外的命名约定?选择方法名称/前缀时使用什么标准?

这是一个例子:

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

该方法getSpecialDates()可以被命名为computeSpecialDates(),findSpecialDates(),selectSpecialDates()elicitSpecialDates()或什么的.或者我可以简单地命名它specialDates().然后,为了保持一致性,我可以重新命名getDates()dates().

为什么要分开应该以"get"为前缀的方法和不应该使用的方法,以及为什么要为"get"找到替换词呢?

Jea*_*ana 27

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

我更喜欢在可能的情况下编写不可变对象(公共最终字段),否则我只使用公共字段:更少的锅炉板代码,更高的生产率,更少的副作用.get/set的最初理由是封装(尽可能让你的对象变得害羞),但事实上,我并不经常需要它.

Effective Java中,Joshua Bloch提出了这个引人注目的建议:

类应该是不可变的,除非有一个很好的理由使它们变得可变......如果一个类不能变成不可变的,尽可能地限制它的可变性.

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

JavaBeans模式有严重的缺点.

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

  • 我同意"首选不可变对象",但不同意有关JavaBeans的最终结论.第二个引用是关于调用一堆用于构造的setter与使用Builder模式 - 而不是一般使用JavaBeans.JavaBeans只是一个*组件*规范.图形和IDE都是必需的 - BeanBox不是JavaBeans的目的; 这只是演示其功能的简单方法.如果"使用一个旨在解决另一个问题的解决方案的不良做法" - 停止使用Java开发Web应用程序--Oak被设计为在电视机顶盒中运行.:P (12认同)
  • 我同意.我的一个小问题:有人会说过多的公共数据很糟糕,因为它会使API变得复杂.我同意.但后来他说解决方案是让它们变得私密并创造出吸气剂和制定者.这有什么用?为什么说"x = myObject.someValue"不好但"x = myObject.getSomeValue()"消除了所有问题?我看到使用getter和setter的唯一好处是有副作用. (4认同)
  • 我一直认为访问器方法的动机是强制对值的约束.例如,您无法阻止客户端将"public int"字段设置为负数,但您的setter可以. (2认同)

Joh*_*ley 16

它来自JavaBeans命名约定.

  • 如果Java会添加真正的属性,我们就不用再担心了.我很失望他们从Java 7提案中删除了. (8认同)

cHa*_*Hao 9

有这么多get*方法的部分原因是Java不支持"属性"la .net/COM,Java bean等使用函数getX和setX来复制名为X的属性的功能.一些IDE用于Java利用这一点来允许设置和检索属性.


Jes*_*per 6

getter和setter方法通常用Java编写的原因之一是因为使用了JavaBeans约定.

但是,标准Java API本身并不一致.例如,class String有一个length()方法,接口Collection定义了一个size()方法,而不是getLength()getSize().

Java不支持统一访问原则,因此您必须编写getter和setter方法来访问属性.


b_e*_*erb 5

一个原因是它是Java Bean Spec的重要组成部分.


use*_*364 5

由于在名称中使用动词(动作),因此对我来说的方法名称是getSpecialDates(),computeSpecialDates()findSpecialDates(),selectSpecialDates()elicitSpecialDates()命令.每次调用它们时,命令都会产生副作用.而像方法名date(),dates(),specialDates()[名词]是与没有副作用返回一个有用的值的方法.多次调用该方法每次都返回相同的值,除非调用其副作用是更改状态的命令.


Pet*_*hev 3

就我个人而言,我对get. 这只是人类的语言。当你想要某样东西时,你就会想要get某样东西。前缀没有任何问题get。关于命名约定,我可以想到Select数据库查询的前缀 -SelectUsers例如。

  • 这只是你的意见,不是事实。 (3认同)