`name()`和`getName()`命名规范有什么区别?

8

我看到一些项目(例如jsoup)正在使用这种新的getter/setter命名约定:

String name()
void   name(String value)

使用新的getter/setter约定:

String getName()
void   setName(String value)

每种命名惯例的优缺点是什么?您认为何时以及为什么应该优先选择其中一种?


6
第一种方法不符合JavaBeans规范,因此在某些地方无法使用。例如,在JSF中使用托管Bean需要实际的getter和setter。 - jahroy
4
除了"beans"方面以外,我认为String s = obj.name();这个语句读起来很好理解,但是obj.name("new name");不像obj.setName("new name")那样明显易懂。 - assylias
5个回答

9
第一个示例不遵循JavaBeans规范 [警告PDF]。有一些框架,比如Spring,假设这种命名约定,特别是当你在EL中做一些事情时,比如${object.name},它会被翻译成object.getName()。如果你不遵循命名约定,这将失败(虽然有方法可以解决)。不讨论何时/是否使用getter/setter的情况下,通常最好坚持命名约定,因为这样会有更少的意外,特别是当你与预期按照约定命名的第三方库或框架集成时。

3

除了可读性和API风格之外,没有别的需要考虑。

一些API可以接受这种风格,而有些则不行,比如SpringinjectionsJSF无法识别这种语法(它们明确要求属性使用get/set方法)。


1
“API风格”:鉴于Spring、JSF(和JPA)等在实践中被广泛使用,这是一个很大的“例外”。 - Raedwald

3

当我处理的对象是不可变的时,我喜欢简单地使用name()。也就是说,我永远不会改变name字段的值。当我处理可变对象时,我会使用你提到的第二种约定,因为我认为它在可读性方面更加优越。


有时我也会使用不可变类来做类似的事情——我会将字段声明为 public final,而不必写访问器。 - Joe K

2

我总是更喜欢使用动词作为方法名,因此对于getter和setter也是有效的。

我只使用名词来表示变量。

遵循经典的JavaBean标准让我感觉更加舒适。 :)


1

如果库是低级别的,并且我想明确表明该组件不是JavaBean,我更喜欢使用较短的样式。

如果有疑问,我会使用JavaBean样式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接