2013-04-22 29 views
7

Aşağıdaki kod, java.util.Calendar sınıfını kullanarak elde edilen yıla göre yalnızca bir değer (bu örnekte yalnızca 10 gösterim için) çıkarır. (- 10 cari yıl) fakat bunun yerine, -10 görüntülerStatik üyeler beklendiği gibi başlatılmamış

public final class Test 
{ 
    private static final Test TEST = new Test(); 
    private static final int YEAR = Calendar.getInstance().get(Calendar.YEAR); 
    private final int eval=YEAR - 10; 

    public static void main(String[] args) 
    { 
     System.out.println("Evaluation "+TEST.eval); 
    } 
} 

Ben bu kod 2003 gösterilecek bekliyoruz. Sabit YEAR'un başlatılmamış olduğunu farz ediyorum. Bu durumda neden böyle oluyor?

+3

'sına ve' YEAT' açıklamalarına sırasını geçmeyi deneyin. –

+0

@LouisWasserman, onun problemini çözmesine rağmen - bu çok davranmak için çok yaramaz bir yoldur :) – alfasin

+0

Açıkçası, ilk başta, bu türden siparişe bağlı kodlara sahip olmak çok yaramaz. –

cevap

5

Eğer YEAR başlatıldı önce sen Test başlatılıyor çünkü bu olur - bu YEAR önce YEAR-10 için eval (örtük) yapıcı gidip başlatır anlamına gelen bir değere sahiptir (yani 0 olduğu varsayılır).

Açıklamalarda belirtildiği gibi, sıfırlama işleminde YIL ve TEST sırasını değiştirmek yalnızca işi değiştirecektir.

+0

Merhaba, bir kod içinde soruyu kod snippet göz önüne alındığında, değerlendirme sırasını hatırlamak nefret dolu/sıkıcı bir iştir. – Tiny

5

static değil - bu alanı kullanabilmek için bir nesne oluşturmanız gerekiyor!

public final class Test 
{ 
    private static final Test TEST = new Test(); 
    private static final int YEAR = Calendar.getInstance().get(Calendar.YEAR);  
    private final int eval=YEAR - 10; 

    public static void main(String[] args) 
    { 
     Test t = new Test(); 
     System.out.println("Evaluation "+t.eval); 
    } 
} 
+0

Bu bariz ama neden bir örnek üyesi olarak 'TEST 'ile çalışmıyor -' 'özel statik final Test TEST = yeni Test(); TEST.eval; '? Teşekkürler. – Tiny

+0

@Tiny TEST başlatıldığında, YEAT başlatılmamış ve varsayılan olarak 0'dır. Statik alanlar, görüntülendikleri sıraya göre başlatılır. –

+0

@Doğru dediğim gibi: "status" ifadesini statik olarak bildirme veya bir örnek oluşturma ve kullanma. Örnek henüz başlatılmamışken, sınıf düzeyi değişkeniyle örnek düzeyi değişkeni kullanamazsınız. – alfasin

1

eval statik olun ve işe yarayacak:

deneyin (veya statik olarak değiştirin). Statik istemiyorsanız, ana yöntemde hesaplamayı yapın.

1

Diğerlerinin de belirttiği gibi, sorun statik alanların sıralıdır. Ama, tembel (gibi singleton pattern yapılır) bir yöntem kullanılarak TEST başlatılıyor tamamen sipariş sorunu önleyebilirsiniz:

public final class Test 
{ 
    private static Test TEST = null; 
    private static final Test getInstance() { 
     if (TEST == null) { 
      TEST = new Test(); 
     } 
     return TEST; 
    } 

    private static final int YEAR = Calendar.getInstance().get(Calendar.YEAR); 
    private final int eval=YEAR - 10; 

    public static void main(String[] args) 
    { 
     System.out.println("Evaluation "+Test.getInstance().eval); 
    } 
} 
İlgili konular