Java'da parametreli yapıcı (lar) içinde nihai referansı başlatma ihtiyacı

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

Yukarıdaki kod bir derleme zamanı hatasıdır. Biliyorum ama diyor ki (NetBeans'da) değişken v başlatılmalıdır. Aşırı yüklü kurucuda başlattığımda sorunu düzeltir ve "doğru" yazdırır. Benim problemim neden tekrar yüklenicilerin aşırı yüklenmiş versiyonunda yeniden başlatmalıyım (varsayılan kurucuda bir kere başlattım) ve aşırı yüklü sürümü bile kullanmıyorum. Niye ya?

0
Bir olasılık, final Vector v = new Vector (); olarak değiştirmektir. O zaman kuruculara yazmanız gerekmeyecek.
katma yazar Vlad, kaynak
Aynı şey yapıcı (lar) aracılığıyla yaparsanız geçerlidir. Yeniden atama yapmanız gerekiyorsa veya vektörü yapım aşamasında başlatmak istemiyorsanız, o zaman kesin olamaz.
katma yazar Vlad, kaynak
Çok doğru, Vlad ama ihtiyaç doğarsa v son bir üye olarak vizyona girmesine izin vermeyecek.
katma yazar Bhavesh, kaynak
Evet, hatamı anladım, Vlad. Çok teşekkürler.
katma yazar Bhavesh, kaynak

3 cevap

Aşırı yüklenmiş kurucu varsayılan olanı çağırmıyor.

Bunu çağırmak için this() komutunu kullanın.

5
katma
+1 - Ve ayrıca v 'nin nihai olarak bildirilmiş olması gerçeği. Eğer final değilse, o zaman iyi olurdu (derleme hatası yok).
katma yazar CoolBeans, kaynak

Yeni bir nesne oluşturduğunuzda, nesneyi başlatmak için sınıfınızın yapıcılarından sadece biri çağrılır. Tüm kurucuların çağrıldığını veya varsayılan (argüman olmayan) kurucunun her zaman çağrıldığını düşünürsünüz. Bu durum böyle değil.

Bu nedenle, her kurucu, final üye değişkenlerinin tümünü başlatmalıdır.

Bir kurucudan this (...) kullanarak başka birisini açıkça çağırdığınızı unutmayın. Örneğin, C (int i) yapıcınızın ilk satırı olarak, bir satır ekleyebilirsiniz: C() <�çağırmak için this (); /code> yapıcı. Başka bir çözüm, üye değişkenini bildirdiğiniz satırda başlatmaktır:

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

    C() {
    }

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

   //... etc.
}

Açık olmayan son üye değişkenlerini başlatmanız gerekmediğini unutmayın; Bunları başlatmazsanız, Java bunları varsayılan bir değerle (ilkel olmayan tür değişkenler için null ) başlatacaktır. Ancak, final üye değişkenlerini açıkça başlatmanız gerekir.

Başka bir not: Vector eski bir koleksiyon sınıftır. Bunun yerine ArrayList kullanmayı tercih etmelisiniz.

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
katma

Aşırı yüklenen yapıcı, siz bunu açıkça yapmadığınız sürece diğer sürümü çağırmaz.

this();

Muhtemelen yapmak istediğin budur.

1
katma