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
}

在后者的情况下,我对在构造函数之前使用一些方法感到不舒服。哪一个是更广泛使用的约定?

4

7 回答 7

24

我相信 Sun(现在是 Oracle)的 Java 编码标准得到了更广泛的应用。这也是您当前正在使用的。

来自Java TM 编程语言的代码约定

3.1.3 类和接口声明

下表按出现的顺序描述了类或接口声明的各个部分。

  1. 类/接口文档注释( /* ... /)
  2. classinterface声明
  3. 类/接口实现注释(/.../),如有必要
  4. 类 ( static) 变量
  5. 实例变量
  6. 构造函数
  7. 方法
于 2011-09-23T14:31:54.887 回答
5

我个人使用选项 2(实例元素和构造之前的静态字段和方法)。对我来说,这在扫描文件时很有意义,因为从一个类的用户那里,我可以在不需要实例的情况下访问静态的东西。因此很高兴在构造函数之前看到它们,因为在使用静态东西时我不关心构造函数。

于 2011-09-23T14:36:14.530 回答
3

仅作记录,这来自您链接的 GWT 文章:

我们承认那里有很多很棒的方法。我们只是试图选择一个至少与 Sun 的 Java 编码约定有些一致的...

所以他们使用的风格

  1. 建议用于 GWT 不用于一般用途
  2. 有点偏离标准约定
  3. 被公认为是众多良好标准之一

所以我想说,如果没有理由不坚持你目前的惯例,为什么要改变它们呢?

于 2011-09-23T14:38:11.690 回答
2

Java 代码约定建议以下内容(这基本上是您已经在做的):

  • 类(静态)变量:首先是公共类变量,然后是受保护的,然后是包级别(无访问修饰符),然后是私有
  • 实例变量:首先是公共的,然后是受保护的,然后是包级别(无访问修饰符),然后是私有的
  • 构造函数
  • 方法:这些方法应该按功能分组,而不是按范围或可访问性分组。例如,私有类方法可以位于两个公共实例方法之间。目标是使阅读和理解代码更容易。
于 2011-09-23T14:35:55.153 回答
0

当然,这都是偏好问题...

您的约定更符合 Javadoc 中的默认顺序(即混合在一起的静态和非静态方法)。这也是我平时的做法。

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

于 2011-09-23T14:35:20.817 回答
0

我将静态初始化程序和方法放在构造函数之前,所以我想我正在关注您的引用。

为什么不舒服?这似乎是一件小事。

于 2011-09-23T14:35:37.137 回答
0

我不知道,但为了它的价值,我做你做的事。上面的构造函数,下面按功能分组的方法(不考虑静态性)。静态方法倾向于分组。

例外是我打算让您使用而不是构造函数的静态工厂方法——如果是这样,它们在构造函数之前,并且 ctor 是私有/受保护的。

于 2011-09-23T14:30:09.897 回答