Java最佳实践 - 在类变量之前声明构造函数是一件坏事吗?

mit*_*_au 10 java coding-style

我正在从一位同事(另一位学生)那里进行Java代码的"静态"代码演练

对我来说,这没有意义; 从上到下阅读这些"组件"对象在声明之前进行实例化(稍后在构造函数中使用).但是,代码很乐意编译并运行.这是不好的做法吗?

Public Class theObject {

    private static final long aVariable = 123123123123123;

    public theObject(...){

        componentOne = new Component(...);
        componentTwo = new Component(...);

        ...
        ...
        componentOne.doSomething(...);
    }

    private Component componentOne;
    private Component componentTwo;
}
Run Code Online (Sandbox Code Playgroud)

Ted*_*opp 39

Sun Microsystems(现在由Oracle接管)于1998年发布了Java编码风格指南,其中他们向一个特定的组织推荐了类声明:

  1. 静态变量字段声明
  2. 实例变量字段声明
  3. 静态初始化程序
  4. 静态成员内部类声明[*]
  5. 静态方法声明
  6. 实例初始化程序
  7. 实例构造函数声明
  8. 实例成员内部类声明[*]
  9. 实例方法声明

请注意,这会将数据声明放在文件的顶部.(1997年早期的Sun出版物没有涵盖上面列表中的所有内容.)唯一重要的排序是在静态字段和实例字段中,然后仅当字段包含引用其他字段的初始化程序时.在初始化之前,您不能在初始化程序中使用字段.类似地,初始化程序(项目3或6)不能对字段进行前向引用,除非作为赋值的目标.(有关此类前向引用的更多信息,请参阅Java语言规范,第8.3.3节.)据我所知,订单无关紧要.

[*]上面列表中的术语(从1998年指南中逐字逐句)对于第4项和第8项是过时的.具体来说,从嵌套类Java教程:

术语:嵌套类分为两类:静态和非静态.声明static嵌套类称为静态嵌套类.非静态嵌套类称为内部类.

在现代用法中,没有"静态成员内部类"这样的东西.


Chr*_*911 9

对此没有真正的共识.大多数人会在类实现的顶部声明类变量,然后是方法,但这不是必需的.像Code Complete这样的一些书建议将变量尽可能接近地宣布为首次使用.这有助于将变量的范围减小到最小.


Vid*_*ige 7

java中的一般声明顺序,(参考:Java编码风格指南)

     public class DeclarationOrder {

        // Class (static) variables
        public static int publicClassVariable;
        protected static int protectedClassVariable;
        static int defaultClassVariable;
        private static int privateClassVariable;

        // Instance variables
        public int publicInstanceVariable;
        protected int protectedInstanceVariable;
        int defaultInstanceVariable;
        private int privateInstanceVariable;

        // Constructors
        public DeclarationOrder() {
            // Public Constructor
        }
        protected DeclarationOrder(int var) {
            // Protected Constructor
        }
        DeclarationOrder(String var) {
            // Default Constructor
        }
        private DeclarationOrder(Double var) {
            // private Constructor
        }

        // Class (static) Methods
        public static void publicClassMethod(){}
        protected static void protectedStaticMethod(){}
        static void defaultStaticMethod() {}
        private static void privateStaticMethod(){}

        // Instance Methods
        public void publicInstaceMethod() {}
        protected void protectedInstanceMethod() {}
        void defaultInstanceMethod() {}
        private void privateInstanceMethod() {}
    }
Run Code Online (Sandbox Code Playgroud)

每组中的顺序应该是,

  1. 上市
  2. 受保护
  3. 包级别(无访问修饰符)
  4. 私人的


Jak*_*rka 5

不会在声明之前将它们实例化.初始化的顺序是固定的Java和它没有关系,其中的代码,你把你的声明和构造函数.

至于惯例,它实际上取决于你喜欢什么.虽然事实上的惯例是首先声明文件,然后是构造函数,但只要不符合您的性质或公司规定,您的方法就像其他任何方法一样有效.

此外,代码中存在更多危险的东西,使其不易读取,例如单字母变量或大量使用不太常见的结构(例如,复杂条件下的三元运算符).组织代码是一个较小的问题,因为任何体面的IDE都可以通过你放置的任何设置重新组织代码.