4
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);
}

}

4

5 回答 5

6

所有初始化器都由编译器添加到每个构造函数的开头。这包括:

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

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

private final String NEWLINE = System.getProperty("line.separator");

或在初始化块中:

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

当然,在这个精确的例子中,你应该使字段static.

于 2010-03-31T19:31:50.717 回答
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);
    }
}

initializer block invoked before Constructor
default constructor
1
:2
:3

initializer block invoked before Constructor
default constructor
constructor(name, number)
1
:2
:3
于 2010-03-31T20:27:19.770 回答
3

做就是了:

final String NEWLINE = System.getProperty("line.separator");

请参阅:JLS 8.3.2。字段的初始化

另请参阅:JLS 12.5 创建新类实例以了解执行顺序。

于 2010-03-31T19:28:12.363 回答
1

如果它们每次都以相同的方式初始化,则可以将代码放在构造函数之外。Java 允许您执行以下操作:

final String NEWLINE = System.getProperty("line.separator");

您还可以让除无参数之外的所有构造函数调用无参数构造函数。例如:

Code(String name, int number)
{
    this();

    name=new Someting(name);
    number = new Magic(number);
}
于 2010-03-31T19:31:14.087 回答
1

另外,如果初始化很复杂并且必须在构造过程中进行,请提供一个返回结果的静态方法,如下所示:

Code()
{
    NEWLINE = newLineValue();
    creation();
}

Code(String name, int number)
{
    NEWLINE = newLineValue();
    creation();

    name = new Something(name);
    number = new Magic(number);
}

private static String newLineValue()
{
    return System.getProperty("line.separator");
}

在这种情况下,这newLineValue()是微不足道的,所以我不会在这里使用它,但如果这实际上有大量的工作,那么它可能会很有用。您还可以从构造函数传入参数。

于 2010-04-01T02:19:44.863 回答