构造函数

在上一家公司工作时候,遇到过一个bug:构造函数里出现了未初始化的变量,导致了空指针异常(java.lang.NullPointerException),于是乎,我开始思考什么才是一个好的构造函数。

我们通过常见的构造函数(constructor)的问题,进行探讨。

  • constructor中出现空指针问题。 Example:

    1
    2
    3
    4
    5
    6
    7
    8
    
    //代码1
    class A{
        public A(){
            //获取文件读取类
            //读取信息
        }
          
    }
    

    这里,若是文件读取类需要相关配置,而该配置还没进行配置,则会出现空指针异常。

    解决方案:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    //代码2
    class 平台类{
        public void start(){
            //初始化文件类
            //读取文件类信息
            new A(信息)
        }
    }
      
    class A{
        public A(信息){
    		//...
        }    
    }
      
      
    

    这里,只要我们明确生命周期,在文件读取类初始化之后再进行调用即可。

    问:什么时候会出现这种问题。

    答:整个系统生命周期乱,且捕捉错误能力差。

  • 数据参数过多。

    • 通过bean或arraylist等装在参数,之后再传入constructor。
    • 通过代码分离,一个类分成两个类进行处理。
    • 使用setter代替非必要参数,从而简化代码。(可选择Method chaining
  • 其他值得注意:

    • 明确constructor是用于初始化,不要添加其他用途(单一功能原则)。

      就像线程类,不会在初始化时运行那样。