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");
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");
bir Proxy
(bu durumda MyObj
MyInterface
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)
Bir ClassCastException alabilirsiniz böylece olmayan jenerik versiyonu türündeki 'myObj' bir nesne döndürür dair bir garanti yok.
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.
İ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.
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");
kim daha iyi olduğunu söylüyor? – Milhous