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

Java中的getter必须根据命名约定始终只返回字段值吗?,java,Java,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

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
字段,并且我们希望根据命名约定返回此字段值?

如果您总是想对返回的值执行一些操作,则可以使用
getXXX
,否则,选择一个单独的名称,因为您可能希望在这行的某个地方读取原始值。

当我编写一个返回某个内容且不是哑getter的方法时,我通常会在使用
get
作为前缀之前进行思考,以避免让类客户端感觉该方法是哑getter。 例如,假设它进行了相对昂贵的计算,那么像
getFoo()
这样的名称可能会产生误导

通常,如果我找到一个比
get
更好的前缀,我就会使用它。例如,有时
find()
compute()
更有意义。
但是由于其他前缀不匹配,我不想太聪明,我保持
get

此外,更清楚地说,如果合同和方法的意图很重要,并且可以使API对类的客户端更友好,您应该使用javadoc来指定合同和方法的意图。

1)通用java命名约定不包括getter:

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

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

3) 即使您可以使用计算,保持getter快速也是一个很好的实践。没人指望你的getter计算一个小时

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

另外,在getter中添加javadoc注释也是一个好主意

4) 如果向类用户公开成员变量,则会出现问题。例如,如果将属性绑定到JAXB中的成员变量,则可能会丢失具有特殊功能的getter


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

IDE会说是的,在Intellij中,如果您命名方法getXXX而没有XXX字段,它会给您一个警告创建一个方法updateXXX(),它将“进行一些计算、解析等”。更新XXX值,然后调用getXXX方法来获取更新后的值。getters的一部分意义在于,您可以将外部代码不必担心的代码放在其中。任何调用
getXXX()
的方法都可能会设想您的类有一个名为
XXX
的字段,该字段只返回,但它是否真的返回了该字段还是执行了其他操作则是一个实现细节。只是别忘了将Javadoc文档添加到您的方法中。然后每个人都会明白你的意图。除了
之外,几乎所有事情都同意。在getter中添加javadoc注释是个好主意。注释通常是一个坏主意,因为代码不断发展,99%的情况下注释保持不变,方法名称应该自我解释,我想当方法名称确切说明方法的功能时,最简单的情况就是使用注释。请注意,您引用的官方java命名约定非常古老(Sun于1999年提出),它提供了一些有用的信息,但绝对不足以涵盖实际标准。