在我正在处理的项目中,我们正在讨论何时在java中使用get(getFoo
)vs普通名称(foo
)。当我在java核心和番石榴中查看时,我看到有很多例子,其中省略了get。是否有任何文档涵盖了guava或新的java API何时使用get前缀以及何时不使用?这些开发人员在这里使用了一个约定吗?
感谢您花时间阅读本文。
示例:
ByteBuffer:http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html#compact() 转发对象:http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/ForwardingObject.html#delegate() 秒表:http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/base/Stopwatch.html#elapsed(java.util.concurrent.TimeUnit) 代码:http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/base/Ticker.html#systemTicker()
编辑:
从http://download.oracle.com/otn-pub/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/beans.101.pdf起," Java Bean是一个可重用的软件组件,可以直观地操作 在构建工具中。"在我们的代码库中,当代码与值或数据对象(表示数据的对象)无关时,会出现get vs no get的问题。当班级代表数据时,我们很乐意做到。
我的主要问题是为什么java和guava都选择对非数据对象使用非get方法,以及它们的约定。
答案 0 :(得分:1)
get
前缀来自JavaBeans Conventions,它指出如果你有一个属性的访问者,那么访问者方法的名称必须以get
开头,除非它是一个布尔值(主要类型),在这种情况下应该以{{1}}开头。请注意,您使用is
前缀返回Boolean类型。
在大多数Java的API中,这是使用的约定,这也是我的建议。你的决定取决于你,但无论你选择哪种约定,我都会建议保持一致,不要混淆两者。
答案 1 :(得分:0)
虽然放弃" get"吸引我的是,当你还有一个二传手时,问题就出现了。你必须做类似的事情
public String name(); // getter
and
public void name(String newName); // setter, xor use the below **instead** but not both
public Foo name(String newName); // if you prefer fluent/builder style
其中"看起来很奇怪"给Java程序员。直到1分钟前,我认为这是非法的,我的原始帖子错误地说,直到我测试它。你每天都学到东西......
已添加以响应@DwB
使用get / set的一个很好的理由是许多第三方框架都期望这种约定,因为它们使用反射来推理你的类。但是,框架可以能够查找上述组合,或配置以使用这些方法而不是通常的get / set。这几乎是我原来的帖子,但是几年后我还没有使用过Spring,Hibernate等等,所以如果你不是这样的话我还不能加快他们中的某些人的胜利。 #39; t使用get / set。
例如,Jackson可以使用注释和mixins来定义映射,不需要遵循get / set约定。我认为Spring,JSF等也可以这样做,(有人请根据需要编辑这个答案,但需要一些额外的工作)。这项额外的工作是否值得"简洁"消除get / set的方法尚不清楚。我说不,但是YMMV。