2010-04-12 17 views
10

Mümkün olduğunda boş koleksiyonları boş döndürürüm. Ben bunu yaparken java.util.Collections kullanmak için iki yöntem arasındaki geçiş: emptyList() tip-güvenli olması gerekiyorduTürü güvenli, genel, boş Statik jeneriklerle koleksiyonlar

return Collections.EMPTY_LIST; 
return Collections.emptyList(); 

. Ama yakın zamanda keşfedilen:

return Collections.<ComplexObject> emptyList(); 
return Collections.<ComplexObject> singletonList(new ComplexObject()); 

vb Eclipse Paketi Explorer'da bu yöntemi bakın

:

<clinit>() : void 

ama bu kaynak kodunda nasıl yapıldığını görmüyorum (1.5). Bu sihirbazlık nasıl oluyor?

DÜZENLEME: Statik Genel tür nasıl tamamlanır? Bu kullanma

+3

Soru nedir? '', jenerik bir yöntem değil, sınıf başlatmayı yapan özel kurucu yönteminin (derleyici tarafından oluşturulan sihir) adıdır. – Dirk

+0

Üzgünüz ... daha açık olmalıydı.Statik bloğun statik jenerik tiple bir ilgisi olduğunu yanlış düşünmüştüm. – Droo

cevap

7

DÜZENLEME: Statik Genel tür nasıl başarılır?

http://www.docjar.com/html/api/java/util/Collections.java.html

public class Collections { 
    ... 
    public static final List EMPTY_LIST = new EmptyList<Object>(); 
    ... 
    public static final <T> List<T> emptyList() { 
     return (List<T>) EMPTY_LIST; 
    } 
    ... 
} 

Sen meraklıysanız, EmptyList sınıfının uygulanması için linki görebilirsiniz, ama Sorunuz için, hiç önemli değil.

+0

Bunun çok basit bir şey olduğunu biliyordum. Genel dönüş türü öneki, buna izin veren nedir? Bugün bir şey öğrendim ... – Droo

+1

"Genel dönüş türü öneki" ile, ilk "", yani evet demektir. Buna rağmen demezdim - geri dönüş türünün bir parçası olarak düşünmemelisiniz. Bunu "public", "static" ve "final" gibi bir (yöntem) değiştirici olarak düşünün. Genel bir yöntem oluşturan yöntem bildirimi üzerinde parametreli tip değiştirici var. –

13
return Collections.<ComplexObject> emptyList(); 

olmayan jenerik koleksiyonları hakkında Eclipse uyarılarına kurtulacaksınız.

Yazılan boş bir liste, boş liste immutable ve Java derleme zamanında jenerik türlerini silme nedeniyle bir türlenmemiş boş liste için işlevsel olarak aynı olacak. Derleme sırasında sınıf başlatma kodunun toplandığı yöntemin adı

+0

@Tom Hawtin - tackline: "Bunu, genel olmayan koleksiyonları kullanma konusunda Eclipse'den gelen uyarılardan kurtulmak için kullanmayı düşünebilirsiniz." Başka bir deyişle, bu bir '@ SuppressWarnings 'notu kullanmak yerine kodu düzeltir. – Powerlord

+0

Unicorns Um, evet. Her ne kadar duygular, uyarıların önemli olmadığı ve onlardan kurtulmak için rastgele bir şey yapması gibi görünüyor. –

+0

@Tom Hawtin - tackline: Şimdi onu övdüm. Bununla birlikte, yazılan ** değişmez ** boş bir listenin, yazılmamış olanla aynı olacağı değişmez. Benim düşünceme göre, jenerik olmayan koleksiyonları kullanma konusunda uyarılar neyse anlamsızdır; Birisi jenerik olmayan bir koleksiyon kullanmak isterse, neden derleyici bunu bir uyarı olarak işaretlemeli? – Powerlord

1

<clinit>. (Yani, static {} bloklarının içindeki tüm kodlar ve kaynak kod sırasına göre statik üyelerin başlatıcıları.)

Yöntem çağrılmasında açık tip parametrelerle bir ilgisi yoktur. Statik başlatıcı bloğu

2

<clinit> 'dir. Tam olarak bir kez çalıştırılan bir kod bloğu (sınıf yüklendiğinde).

Yani, yerine

class A { 
    static int x = 5; 
} 

One yazma yazabilirsiniz:

class A { 
    static int x; 

    static { // static initializer starts 
     x = 5; 
    } 
} 

Bu iki seminer eşdeğerdir. Statik başlatıcı bloğun içinde rastgele kodlar yerleştirilebilir ve böylece statik alanların karmaşık hesaplamalar sonucu başlatılabilir.

İlgili konular