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

これは、最終変数を初期化する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 に答える
6

すべての初期化子は、コンパイラによって各コンストラクターの先頭に追加されます。これも:

  • インスタンス変数の初期化
  • 初期化ブロック{ .. }

したがって、これをどこにでも含める必要はなく、インスタンス変数の初期化として配置するだけです。

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

または初期化ブロックで:

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

もちろん、この正確な例では、フィールドを作成する必要がありますstatic

于 2010-03-31T19:31:50.717 に答える
3

ただ行う:

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

参照: JLS 8.3.2。フィールドの初期化

参照:実行順序については、JLS 12.5 新しいクラス インスタンスの作成。

于 2010-03-31T19:28:12.363 に答える
1

もう 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 に答える
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 に答える