如何避免代码重复初始化最终属性?

Her*_*che 4 java constructor final

public class Code{

//many properties
//...

final String NEWLINE;// ohh a final property!

void creation() //this method is for avoid repetition of code
{        

    //final initialization can't be put here =(

    Source= new StringBuffer();

   //many other commons new's ..
   //...
}

Code()
{
    NEWLINE = System.getProperty("line.separator");
    creation();
}

Code(String name, int numberr)
{
    NEWLINE = System.getProperty("line.separator");
    creation();

    name=new Someting(name);
    number = new Magic(number);
}
Run Code Online (Sandbox Code Playgroud)

}

Boz*_*zho 6

编译器将所有初始值设定项添加到每个构造函数的开头.这包括:

  • 实例变量初始化
  • 初始化块 { .. }

因此,您不必将它包含在任何地方,只需将其作为实例变量初始化:

private final String NEWLINE = System.getProperty("line.separator");
Run Code Online (Sandbox Code Playgroud)

或者在初始化块中:

{
     NEWLINE = System.getProperty("line.separator");
}
Run Code Online (Sandbox Code Playgroud)

当然,在这个精确的例子中,你应该创造这个领域static.


cro*_*wne 6

这是您的代码,有4种不同的方法来初始化最终变量.

  1. 排队
  2. 匿名初始化程序块
  3. 在构造函数中初始化
  4. 显式调用默认构造函数

结果输出如下所示.

public class Code {

    // many properties
    private String name;
    private String number;
    // ...

    // 1.
    final String NEWLINE_1 = "1" + System.getProperty("line.separator");
    final String NEWLINE_2;
    final String NEWLINE_3;

    // 2.
    {
        System.out.println("initializer block invoked before Constructor");

        NEWLINE_2 = "2" + System.getProperty("line.separator");
        // final initialization CAN be put here =(

        // Source = new StringBuffer();

        // many other commons new's ..
        // ...
    }

    Code() {
        System.out.println("default constructor");
        // NEWLINE_1 = "error";     can't do this
        // NEWLINE_2 = "error";     can't do this

        // 3.
        NEWLINE_3 = "3" + System.getProperty("line.separator");
    }

    Code(String name, int number) {
        // 4.
        this();
        System.out.println("constructor(name, number)");

        name = new String("Someting(name)");
        this.number = new String("Magic(number)");
    }

    public static void main(String[] args) {
        Code code_1 = new Code();
        System.out.println(code_1.NEWLINE_1 + ":" + code_1.NEWLINE_2 + ":" + code_1.NEWLINE_3);

        Code code_2 = new Code("crowne", 2);
        System.out.println(code_2.NEWLINE_1 + ":" + code_2.NEWLINE_2 + ":" + code_2.NEWLINE_3);
    }
}
Run Code Online (Sandbox Code Playgroud)
initializer block invoked before Constructor
default constructor
1
:2
:3

initializer block invoked before Constructor
default constructor
constructor(name, number)
1
:2
:3
Run Code Online (Sandbox Code Playgroud)