SORU
29 Ocak 2009, PERŞEMBE


Java Jenerik

Biri anlattı, mümkün olduğunca detaylı olarak, aşağıdaki türleri arasında farklılıklar olabilir?

List

List<Object>

List<?>

Bir cevap değil, bir link alabilir miyim?

Bana bu daha özel hale getirelim.

Ne zaman kullanmak isterim

public void CanYouGiveMeAnAnswer( List l ){}

?

Ne zaman kullanmak isterim

public void CanYouGiveMeAnAnswer( List<Object> l ){}

?

Ne zaman kullanmak isterim

public void CanYouGiveMeAnAnswer( List<?> l ){}

?

CEVAP
29 Ocak 2009, PERŞEMBE


Diğer mesajlar belirtildiği gibi, bir Java özelliği jenerik aradı mı soruyorsunuz? C , bu şablonları denir. Java börtü böcek ile başa çıkmak için çok tamer.

Bana sorularınızı işlevsel olursa o OO tartışmalar için Terbiyesiz bir kelime olsa da cevap vereyim.

Jenerik önce, Vektör gibi iyi eski beton sınıfları vardı.

Vector V = new Vector();

Vektörler onlara verdiğiniz eski nesne tutun.

V.add("This is an element");
V.add(new Integer(2));
v.add(new Hashtable());

Ancak, bir Nesne (tüm Java sınıflarının kök) vermek her şeyi döküm. Bu değerler yöneliminiz saklanan almaya çalışır kadar TAMAM. Bunu yaptığınızda, orijinal sınıf eğer bir şey anlamlı yapmak istiyorsan () değerini geri atmak gerekir.

String s = (String) v.get(0);
Integer i = (Integer) v.get(1);
Hashtable h = (Hashtable) v.get(2);

Döküm çok eski hızlı alır. Daha da önemlisi, derleyici kontrolsüz yayınları hakkında en mızmızlanmaz. Bu canlı bir örneğin, Apache, XML-RPC kitaplığı (sürüm 2 neyse) kullanın. Bu en önemli sorun, Vektör tüketiciler kendi değerleri tam sınıf bilmek zorundaderleme zamanıdoğru çıkabilmesi için. Vektör üretici ve tüketici birbirlerinden tamamen izole olduğu durumlarda, bu önemli bir sorun olabilir.

Jenerik girin. Jenerik jenerik işlemleri yapmak için türü kesin belirlenmiş bir sınıf oluşturmak için girişimi.

ArrayList<String> aList = new ArrayList<String>();
aList.add("One");
String element = aList.get(0); // no cast needed
System.out.println("Got one: "   element); 

Eğer dört rezil çete bak şimdiTasarım Desenlerikitap, uygulama sınıfı değişkenleri boşanmaktan bazı hikmet vardır. Daha iyi uygulama yerine sözleşmelerinin düşünüyorum. Bu yüzden, tüm Liste nesneleri aynı şeyler diyebilirsiniz: , *, size(), *get()17 vb. Ancak, itaat etmek için çeşitli şekillerde sözleşme (*20 örneğin*) seçebilirsiniz Listesi operasyonların birçok uygulama vardır. Ancak, bu nesne ile anlaşma veri türü, genel sınıf kullanıcı için bir çalışma zamanı dikkate olarak bırakılır. Hepsini bir araya koyun ve kodu çok sık: aşağıdaki satırı göreceksiniz

List<String> L = new ArrayList<String>();

Bunu okumalısınız "L String nesneleri ile ilgilenir Listesi türüdür. Fabrika sınıfları ile ilgili başlattığınızda, belirli uygulamaları yerine sözleşmeleri ile başa çıkmak için çok önemlidir. Fabrikalar zamanında çeşitli nesneler üretmek.

Kullanarak jenerik çok kolay (çoğu zaman). Ancak, çok kötü bir günde, genel bir sınıf uygulamak istiyorum karar verebilir. Belki büyük yeni Liste bir uygulama düşündüm. O sınıf tanımlarken, bu yöntem tarafından yönetilen nesne türü için bir yer tutucu olarak <t> kullanın. Eğer karıştı iseniz, rahat olana kadar Liste için genel sınıfları kullanın. Sonra, biraz daha güvenli bir uygulama içine dalabilirsiniz. Veya TOTEM ile birlikte çeşitli Liste sınıfları için kaynak koda bakabilirsiniz. Açık kaynak kodlu harika bir yoldur.

Oracle/Güneşe bir bak docs about generics. Şerefe.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • David Tedeyev

    David Tedeye

    20 AĞUSTOS 2011
  • FPSRussia

    FPSRussia

    19 NİSAN 2010
  • monkophile

    monkophile

    25 Temmuz 2007