2009-02-23 17 views
5

Aşağıdakiler neden eski döküm yönteminden daha iyi görülüyor?Java jenerikleri

MyObj obj = someService.find(MyObj.class, "someId");

vs

MyObj obj = (MyObj) someService.find("someId");

+1

kim daha iyi olduğunu söylüyor? – Milhous

cevap

4

bir Proxy (bu durumda MyObjMyInterface olması gerekir) kullanılarak hizmet yöntemi uygulamaya izin vermek için olacak bir açık tür parametresini kullanarak bir başka avantajı. Açık tip parametreleri olmadan, bu mümkün olmazdı.

Birçok nedenden (biri için test)

9

Bir ClassCastException alabilirsiniz böylece olmayan jenerik versiyonu türündeki 'myObj' bir nesne döndürür dair bir garanti yok.

6

Durum 1 durumunda, iyi uygulanmış hizmetlertüründe MyObj türünde bir kimlik bulunamadığında boş döndürülebilir. Ayrıca, ilk durum, servisin, MyObj tipinde sınıflarla çalışmak için belirli bir mantığa sahip olmasını mümkün kılmaktadır.

2 numaralı durumda, eğer instanceof'i kullanmıyorsanız (mümkün değilse), o zaman yakalamanız ve kullanmanız gereken çirkin bir ClassCastException riski vardır.

3

İlk senaryonun neden daha iyi olmasının bir nedeni, find(Class,String) yönteminin artık dönüş değeri için atanmış olduğunu bilmesidir. Bu nedenle, artık doğru tipin döndürülmesini beklemek yerine, dahili olarak herhangi bir döküm yapabilmektedir. Örneğin, "someId" ile çağrıldığında, find yönteminin dahili olarak String nesnesini bulduğunu varsayalım. find yönteminin, String ürününü MyObj örneğine dökmek için bir stratejisi olabilir.

0

düşmez iyiye yorganın altında bir Proxy kullanabilir. Muhtemelen çok özel durumlar dışında kötü. Bu tür bir şeye ihtiyaç duyduğunuz zaman, hedefin, sınıf nesnesi - fabrika yöntemleri ve malzemeleri üzerinde newInstance() (vb.) Olarak adlandırılması gerektiğidir. Eğer elektronları kaydetmek istiyorsanız

ve ödeyecekleri bu da çalışacak

MyObj obj = someService.find((Class<MyObj>) null, "someId");