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

2022-09-03 08:21:08

我正在对同事(另一名学生)的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;
}

答案 1

Sun Microsystems(现在由Oracle接管)于1998年发布了Java Coding Style Guide,其中他们推荐了一个特定的组织来进行类声明:

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

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

[*]上述清单中的术语(逐字摘自1998年指南)在项目4和8方面已经过时。具体来说,从关于嵌套类的 Java 教程中可以看出:

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

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


答案 2

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() {}
    }

每组内的顺序应为:

  1. 公共
  2. 保护
  3. 包级别(无访问修饰符)
  4. 私人