使用'的Java/Guava约定;获取';前缀

使用'的Java/Guava约定;获取';前缀,java,guava,Java,Guava,在我正在从事的一个项目中,我们正在讨论在java中何时使用get(getFoo)和普通名称(foo)。当我在JavaCore和guava中查看时,我发现有许多示例省略了get。是否有任何文档说明guava或新JavaAPI何时使用get前缀以及何时不使用?这些开发者在这里有约定吗 感谢您抽出时间阅读此文章 示例: ByteBuffer: 转发对象: 秒表: 股票代码: 编辑: 截至年,“JavaBean是一个可重用的软件组件,可以进行可视化操作 在我们的代码库中,当代码与值或数据对象(表示数据的

在我正在从事的一个项目中,我们正在讨论在java中何时使用get(
getFoo
)和普通名称(
foo
)。当我在JavaCore和guava中查看时,我发现有许多示例省略了get。是否有任何文档说明guava或新JavaAPI何时使用get前缀以及何时不使用?这些开发者在这里有约定吗

感谢您抽出时间阅读此文章

示例:

ByteBuffer: 转发对象: 秒表: 股票代码:

编辑:

截至年,“JavaBean是一个可重用的软件组件,可以进行可视化操作 在我们的代码库中,当代码与值或数据对象(表示数据的对象)无关时,get vs no get的问题就会出现。当类表示数据时,我们可以很好地执行get


我的主要问题是为什么java和guava都选择对非数据对象使用非get方法,以及它们的约定是什么。

前缀来自,表示如果您有属性的访问器,那么访问器方法的名称必须以
get
开头,除非它是一个布尔值(primative类型),在这种情况下,is应该以
is
开头。请注意,使用
get
前缀返回布尔类型


在Java的大部分API中,这是使用的约定,这也是我的建议。你的决定取决于你,但无论你选择哪种惯例,我都建议保持一致,不要将两者混为一谈。

虽然放弃“得到”的想法吸引了我,但当你也有一个二传手时,问题就来了。你必须做一些类似的事情

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等了,所以如果你不使用get/set的话,我还没有掌握其中一些工具的最新进展


例如,Jackson可以使用注释和mixin来定义映射,而无需遵循get/set约定。我认为Spring、JSF等也可以这样做(请有人根据需要编辑这个答案,并提供详细信息),不过需要做一些额外的工作。这些额外的工作是否值得消除get/set的“简洁性”尚不清楚。我会说不,但是我会的

有趣的是,似乎涵盖了除getter和setter之外的所有内容。每个开源java项目都希望您遵守此约定。为什么compact应该是getCompact?用于“fluent”构建器的另一种约定是让setter为类型foo(argtype),getter为argtype foo()。好的观点-你能给我的答案投赞成票吗?:-)非常确定您上面写的内容是非法的-您不能用两个使用相同参数的实现来重载方法(
void name(String)
&
Foo name(String)
);但是,如果您的意思是您认为方法重载通常是非法的,那么请放心,它不是:-)您不能同时执行void和Foo,您必须选择其中之一。将编辑帖子说“xor”。这对Java来说是个糟糕的主意。JavaBeans命名约定是Java的基础。偏离这一惯例将导致意想不到的问题,因为一切都希望你遵守它。@DwB不是世界末日,是吗?只是停止使用任何现有的java框架,如springMVC、JSF、JSTL标记、gson、jackson、cxf和许多其他框架。我的主要问题是为什么以及何时java和guava都选择不使用get。“为数据对象获取/设置是可以的,我们的主要问题是为什么非数据对象不遵循此约定。@ekaqu非数据对象不遵循此约定,因为它仅适用于数据对象。”。另请参见为什么集合类不遵循bean约定。感谢@TavianBarnes提供的链接!