Javaでパラメータ化されたコンストラクタ内の最終参照を初期化する必要がある

import java.util.*;

public Class C
{
     final Vector v;
     C()
     {
          v=new Vector();
     }

     C(int i)
     {
          //Here, it is an error. v might not have been initialized.
     }

     public void someMethod()
     {
           System.out.println(v.isEmpty());
     }

     public static void main(String[] args)
     {
          C c=new C();
          c.someMethod();
     }
} 

上記のコードはコンパイル時エラーです。私は知っているが、それは(NetBeansで)変数vを初期化する必要があると言います。オーバーロードされたコンストラクタで初期化すると、問題が修正され、 "true"が出力されます。私の問題は、コンストラクタのオーバーロードされたバージョンで再度初期化する必要があるということです(デフォルトのコンストラクタで一度初期化しました)、私はオーバーロードされたバージョンを使用していません。どうして?

0
1つの可能性は、それを final Vector v = new Vector(); に変更することです。それから、コンストラクタに書き込む必要はありません。
追加された 著者 Vlad,
あなたがコンストラクタを使って同じことをするなら、同じことが適用されます。それを再割り当てする必要がある場合や、構築中のベクターを初期化したくない場合は、それを最終にすることはできません。
追加された 著者 Vlad,
それはあまりにも正確ですが、Vladが必要になった場合、vが最終的なメンバーであるので、後でそれを初期化することはできません。
追加された 著者 Bhavesh,
はい、私は間違いを認識しました、ヴラッド。どうもありがとう。
追加された 著者 Bhavesh,

3 答え

オーバーロードされたコンストラクタはデフォルトのコンストラクタを呼び出さないためです。

this()を使用して呼び出します。

5
追加された
+ +また、 v がfinal宣言されているという事実もあります。もしそれが最終的でなかったらそれはうまくいっていたでしょう(コンパイルエラーなし)。
追加された 著者 CoolBeans,

新しいオブジェクトを作成すると、クラスのコンストラクタの1つだけが呼び出され、オブジェクトが初期化されます。あなたは、すべてのコンストラクタが呼び出されるか、デフォルト(引数なし)コンストラクタが常に呼び出されると考えるようです。そうではありません。

したがって、各コンストラクタはすべての final メンバ変数を初期化する必要があります。

あるコンストラクタから this(...)を使って別のコンストラクタを明示的に呼び出すことができます。たとえば、 C(int i)コンストラクタの最初の行に this(); という行を追加して、/code>コンストラクタです。別の解決策は、宣言した行のメンバ変数を初期化することです:

public class C {
   //v will be initialized, no matter which constructor will be used
    final Vector v = new Vector();

    C() {
    }

    C(int i) {
       //...
    }

   //... etc.
}

final メンバー変数を明示的に初期化する必要はありません。それらを初期化しないと、Javaはデフォルト値(非プリミティブ型変数の場合は null )で初期化します。しかし、 final メンバ変数を明示的に初期化する必要があります。

別の注記: Vector は従来のコレクションクラスです。代わりに ArrayList を使用する方がよいでしょう。

Third note: Use generics to make your code more type-safe. For example, if you need to store strings in a list, use ArrayList instead of the raw type ArrayList.

4
追加された

オーバーロードされたコンストラクタは、明示的にそれを実行しない限り、他のバージョンを呼び出さない

this();

それはおそらくあなたがしたいことです。

1
追加された