2011-07-08 27 views
2

コンストラクタで 'super()'の呼び出し後に初期化ブロックが実行されることがわかりました。コンストラクタ内の初期化ブロック

public class SimpleListLocalsAnalysis extends BackwardFlowAnalysis 
    FlowSet emptySet; 

    public SimpleLiveLocalsAnalysis(UnitGraph graph) { 
     super(graph); 

     { 
      Chain locals = g.getBody().getLocals(); 
      FlowUniverse localUniverse = new FlowUniverse(locals.toArray()); 
      emptySet = new ArrayPackedSet(localUniverse); 
     } 

     doAnalysis(); 
    } 
... 
} 

上記のコードは、単に「スーパー(グラフ)」の呼び出しの後に初期化ブロック内で起こっていくつかの初期化を示しています。しかし、今朝いくつかのコードを見たとき、私は次を発見しました。 superへの呼び出しの後に必ず実行されるので、コンストラクタ内の初期化ブロックにコードを配置する目的は何ですか。私はここに何かを逃していますか

答えて

6

そのがないinitilizationブロック、その簡単なブロック

だけ

public void foo(){ 

    { 
     //some code 
    } 
} 

目的のように:

あなたは見つけるための最善の方法は、おそらくあるスコープ

+1

「単純ブロック」の目的は何ですか?なぜそれを使用するのですか? – Joeblackdev

+3

あなたはスコープの利点を持つことができます..あなたはこのブロックでいくつかのローカルなことをすることができます。 –

+1

あなたが定義したものがブロックの外部にアクセスできないようにするにはどうすればいいですか?これはなぜあなたがそれらを使うのですか? – Joeblackdev

2

が制限されていることができますコードの作者に尋ねる。たぶん彼はこれらの初期化の重要性を示すためにコードブロックを囲んでいたかもしれません。あるいは、localslocalUniverseは、emptySetの初期化にのみ使用されることを示したいと思うかもしれません。一方

、Javaであなたが

public class SomeClass extend ParenClass{ 
    private int val; 

    { 
     //initializztion block 
     val = -1; 
    } 

    public SomeClass() 
    { 
     super(); 
    } 

    public SomeClass(String iniName) 
    { 
     super(iniName); 
    } 
} 

ような何かを行うことができ、初期化ブロックは、コンパイル時に(スーパー呼び出し後)コンストラクタの各の先頭にコピーされます。

おそらく、著者が間違った場所にコードブロックをコピーして貼り付けた可能性があります。コンストラクタの外側ではなくコンストラクタにコピーしました。

関連する問題