Java 中的 getter 必须根据命名约定始终只返回字段值吗?



getXXX用作XXX的getter。例如

class Foo {
private String XXX;
public String getXXX() {
return XXX;
}
}

所以,它很清楚,毫无疑问。现在让我们考虑以下情况:

class Foo {
public String getXXX() {
String XXX;
//some calculations, resolvings etc
return XXX;
}
}

在这种情况下,我可以根据命名约定将我的方法命名为getXXX吗?或者换句话说,getXXX是否假设类中有XXX字段,并且我们希望根据命名约定返回此字段值?

当我编写一个返回某些东西并且不是一个愚蠢的获取器的方法时,我经常在前缀之前通过get来避免给类客户端带来该方法是一个愚蠢的获取者的感觉。 例如,假设它进行相对昂贵的计算,则诸如getFoo()之类的名称可能会产生误导。

一般来说,如果我找到一个比get更好的前缀,我会使用它。 例如,有时find()compute()可能更有意义。
但是由于其他前缀不匹配,我不会试图太聪明,我会保持get.
此外,为了更清楚,您应该使用 javadoc 来指定方法的约定和意图,如果它很重要,并且可以使 API 对类的客户端更友好。

1) Getters 不在一般 Java 命名约定的涵盖范围内: http://www.oracle.com/technetwork/java/codeconventions-135099.html

2) Getters 是 javabeans 命名约定的一部分,您可以在其中定义 getXxx/isXxx 方法来获取属性 xxx 的值。同时,您不必使此getter与成员变量保持同步 - 成员变量是私有的(包私有),这是有意的。如果有必要,您甚至可以摆脱成员变量 - 当有访问器方法时存在 bean 属性。

也就是说,知道你在做什么,你可以在 getter 和 setter 中使用任何计算。

3)即使你可以使用计算,保持快速的getter也是一个很好的做法。没有人期望你的getter计算几个小时的东西。

如果您第一次必须计算一些大的东西,请进行一些缓存,不要每次都运行计算。在特殊的 init()/prepare() 方法中进行计算也是一个好主意。

此外,将javadoc注释添加到您的getter也是个好主意。

4) 如果将成员变量暴露给类用户,则会出现此问题。例如,如果在 JAXB 中将属性绑定到成员变量,那么可能会错过具有特殊功能的 getter。

对于这种情况,没有 getter 的 POJO 可能比具有自定义行为的复杂类更容易处理。但是仔细设置访问器绑定并没有错,它只需要多几个按钮和一点额外的思考。

如果您一直想对返回值执行一些操作,则可以使用getXXX,否则,请选择一个单独的名称,因为您可能希望沿线的某处读取原始值。

最新更新