Java静态方法的编码规范

14

这是一个非常简单的问题,但我认为它有点具有争议性。

在编写Java类时,我使用以下顺序。

class Foo {

    // static fields
    // instance fields
    // constructors
    // methods (non-static and static methods are mixed but sorted based on their functionalities)
}

我读到一篇文章说:
(来源于http://code.google.com/webtoolkit/makinggwtbetter.html#codestyle

Java类型应该按照以下成员顺序排列:

嵌套类型(内部类和静态类混合是可以的)
静态字段
静态初始化器
静态方法
实例字段
实例初始化器
构造函数
实例方法

如果我遵循这篇文章,上述顺序应该为:

class Foo {

    // static fields
    // static methods
    // instance fields
    // constructors
    // instance methods
}

就后者而言,在构造函数之前有一些方法让我感到不舒服,那么哪种惯例被更广泛地使用?

7个回答

24

我相信Sun(现在是Oracle)的Java编码规范更为广泛应用。这也是您目前正在使用的编码规范。

参考Java编程语言的代码规范

  

3.1.3 类和接口声明

     

以下表格描述了类或接口声明的各个部分,以它们应出现的顺序排列。

     
      
  1. 类/接口文档注释 ( /*.../)
  2.   
  3. classinterface 语句
  4.   
  5. 类/接口实现注释 ( /.../),如果需要
  6.   
  7. 类 (static) 变量
  8.   
  9. 实例变量
  10.   
  11. 构造函数
  12.   
  13. 方法
  14.   

1
嗯,我明白了。我认为我正在使用标准。谷歌的一些编码风格让我感到困惑,特别是sdk中的Android示例。 - Heejin
4
静态方法与普通方法有何区别? - ealeon
1
如果没有特别说明静态方法,我通常会将它们放在实例变量之上,如果它们是公共的话。当它们是工厂方法时,对我来说更是如此。我会尝试找到更完整的标准约定描述。 - Dici

5

个人而言,我使用选项2(静态字段和方法在实例元素和构造函数之前)。对我来说,当扫描文件时,这是有意义的,因为从类的用户的角度来看,我可以访问静态内容而不需要实例。因此,在构造函数之前看到它们很好,因为我在使用静态内容时不关心构造函数。


反驳是99%的时间您使用实例,因此将静态和内部类放在底部更好。 - Enerccio
@Enerccio,我不确定我同意你的说法。我发现很多时候类要么是全状态实用程序,要么是所有实例方法类,或者当有混合时,静态方法往往是入口点(如工厂方法)。因此,我建议当有混合时,通常从静态方法开始,然后在获得实例后使用实例方法。 - John B
还有一种优化方法是使用静态方法。 - Enerccio

3

根据Java代码规范的建议(基本上是您已经在做的):

  • 类(静态)变量:首先是public类变量,然后是protected,然后是包级别(没有访问修饰符),最后是private
  • 实例变量:首先是public,然后是protected,然后是包级别(没有访问修饰符),最后是private
  • 构造函数
  • 方法:这些方法应该按功能分组,而不是按范围或可访问性分组。例如,一个私有的类方法可以在两个公共实例方法之间。目标是使代码易于阅读和理解。

3
仅供参考,以下是您提供的GWT文章的翻译内容:

我们承认存在许多优秀的方法。我们只是尝试选择一种与Sun的Java编码约定至少有些一致的方法...

我们承认存在许多优秀的方法。我们只是尝试选择一种与Sun的Java编码约定至少有些一致的方法...

因此,他们使用的风格

  1. 是为GWT而提出的,而不是用于一般用途
  2. 在某种程度上偏离了标准约定
  3. 被认为是许多好标准之一

所以,我想说,如果没有理由不坚持您当前的约定,为什么要改变它们呢?


0

我不知道,但是就我的经验而言,我做的和你一样。构造函数在顶部,方法按功能分组(无论是否静态)在下面。静态方法往往会分组。

唯一的例外是静态工厂方法,我打算让你使用它们来代替构造函数 - 如果是这样,它们将位于构造函数之前,并且构造函数是私有/受保护的。


0

当然,这都是个人喜好的问题...

你的惯例更符合Javadoc中默认的排序方式(即静态和非静态方法混合在一起)。这也是我通常做的。

然而,内部类通常被放置在类的底部,因为它们通常是“次要”或“辅助”类,把它们放在外部类的主要内容之前似乎有些奇怪。


没错,我也把内部类放在类的底部。 - Heejin

0

我把静态初始化器和方法放在构造函数之前,所以我想我遵循了你的引用。

为什么感到不适?这似乎是小事情。


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