Soru Kurucuda statik bir final alanı başlat


public class A 
{    
    private static final int x;

    public A() 
    {
        x = 5;
    }
}
  • final değişkenin sadece bir kez (yapıcıda) atanabileceği anlamına gelir.
  • static bir sınıf örneği demektir.

Bunun neden yasak olduğunu göremiyorum. Bu anahtar kelimeler birbirleriyle nasıl çakışır?


76
2018-02-23 16:28


Menşei




Cevaplar:


Her sınıf oluşturulduğunda bir kurucu çağrılır. Böylece, yukarıdaki kod, bir örneğin oluşturulduğunda x değerinin yeniden başlatılacağı anlamına gelir. Ancak değişken son olarak bildirildiğinden (ve statik), bunu yalnızca yapabilirsiniz

class A {    
    private static final int x;

    static {
        x = 5;
    }
}

Ancak, statik kaldırırsanız, bunu yapmanıza izin verilir:

class A {    
    private final int x;

    public A() {
        x = 5;
    }
}

Veya bu:

class A {    
    private final int x;

    {
        x = 5;
    }
}

162
2018-02-23 16:32



Açık ve basit cevap için +1 - sactiw
Görünüşe göre, hiç kimse, statik değişkenlerin bir sınıfın tüm örneklerinde var olan değişkenler olduğunu açıklamaktan rahatsız olmadı. Bu nedenle, sınıf yüklendiğinde, sadece bir kez, sınıfın birçok örneği inşa edildiğinde değil, anında örneklendirilebilirler. - iheanyi
Ayrıca, yalnızca statik bir blok yerine, bildirimde atamanızı tavsiye ederim. Sadece daha temiz ve muhtemelen OP'nin yapmak istediği şey: private static final int x = 5; - qwertzguy


Statik son değişkenler, sınıf yüklendiğinde başlatılır. Kurucu daha sonradan çağrılabilir veya hiç istenmeyebilir. Ayrıca, kurucu birden çok kez (her yeni nesne ile) çağrılacaktır, böylece alan artık nihai olamazdı.

Statik final alanınızı başlatmak için özel mantığa ihtiyacınız varsa, bunu statik bir bloğa koyun.


15
2018-02-23 16:31



Tamam, ama ne olduğunu açıkladın. Nedenini soruyorum? Demek istediğim, işe yaramazsa, statik olmadan çalışır. Yani her ikisini birleştirmek yeni bir mantık oluşturur? - Yaron Levi
@YaronLevi o sadece söyledi ... statik alan sınıfın bir üyesidir. Yapıcınızdaki değişkene bir değer atayacaksınız. Son kelime, sadece bir değişkene bir değer atayabileceğiniz anlamına gelir, kodunuzda, sınıf her açıldığında değişkene bir değer atarsınız - çünkü değişken statiktir (sınıfın bir üyesidir). Statik olursanız, her seferinde yeni bir değişkeni olduğu için kurucuya bir değer atayabilirsiniz. Eğer finalden kurtulursanız, o zaman sadece herhangi bir zamanda yeni bir değer atayabileceğiniz statik bir değişkendir. - user12345613
@ user12345613 oldukça iyi bir açıklama yaptı. Yalnız, son ya da statik çalışma; ama bir kez bir araya getirildiğinde, “statik final”, o sınıf için tüm örneklerde sadece bir alan olduğunu ve sadece kaç tane örneğe bakılmaksızın başlatılabileceğini gösterir. - user908645


Bir nesneyi ikinci kez başlattığınızda neler olduğunu düşünün. Statik bir final olarak açık bir şekilde yasaklanmış olan TEKRARLAMAYI ayarlamaya çalışır. Örneğin, tüm sınıf için yalnızca bir kez ayarlanabilir.

Bildirdiğinizde değeri ayarlamanız gerekir

private static final x=5;

Ek mantık veya daha karmaşık bir örneğe ihtiyacınız varsa, bu statik başlatıcı blokta yapılabilir.


6
2018-02-23 16:32





static Değişkenin uygulamada benzersiz olduğu anlamına gelir. final sadece bir kez ayarlanması gerektiği anlamına gelir.

Kurucunuza ayarlarsanız, değişkeni bir kereden fazla ayarlamanıza izin verirsiniz.

Bu nedenle, onu doğrudan yönlendirmeli veya başlatmak için statik bir yöntem önermelisiniz.


5
2018-02-23 16:33





final Bunun yapıcıda başlatılması gerektiği anlamına gelmez. Genel olarak bu ne yapılır:

 private static final int x = 5;

statik bunun yerine, değişkenin sınıfın birden çok örneği aracılığıyla paylaşılacağı anlamına gelir. Örneğin :

public class Car {
   static String name;
   public Car(String name) {
      this.name = name;
   }
}

...

Car a = new Car("Volkswagen");
System.out.println(a.name); // Produces Volkswagen

Car b = new Car("Mercedes");
System.out.println(b.name); // Produces Mercedes
System.out.println(a.name); // Produces Mercedes

3
2018-02-23 16:38





Bunu düşün. Bunu kodunuzla yapabilirsiniz:

A a = new A();
A b = new A(); // Wrong... x is already initialised

X'i başlatmak için doğru yollar:

public class A 
{    
    private static final int x = 5;
}

veya

public class A 
{    
    private static final int x;

    static
    {
        x = 5;
    }
}

2
2018-02-23 16:33





    public class StaticFinalExample {
  /*
   * Static final fields should be initialized either in
   * static blocks or at the time of declaration only
   * Reason : They variables are like the utility fields which should be accessible
   * before object creation only once.
   */
  static final int x;

  /*
   * Final variables shuould be initialized either at the time of declaration or
   * in initialization block or constructor only as they are not accessible in static block
   */
  final int y;

  /*
   * Static variables can be initialized either at the time of declaration or
   * in initialization or constructor or static block. Since the default value is given to the
   * static variables by compiler, so it depends on when you need the value
   * depending on that you can initialize the variable appropriately
   * An example of this is shown below in the main method
   */
  static int z;

  static {
    x = 20; // Correct
  }
  {
    y = 40; // Correct
  }
  StaticFinalExample() {
    z = 50; // Correct
  }
  public static void main (String args[]) {
    System.out.println("Before Initialization in Constructor" + z);   // It will print 0
    System.out.println("After Initializtion in Constructor" + new StaticFinalExample().z); // It will print 50
  }
}

0
2018-04-05 10:59