Bugün, sorgulanabilir bulduğum bir kodla karşılaştım. İşte basitleştirilmiş bir örnek (gerçekçi değil).Java jeneriklerini koleksiyonları döndüren arabirimlerde kullanma. En iyi pratik? Tuzaklar?
public interface IListable {
//returns first n items from list
public ArrayList getFirstNThings(int n);
//returns last n items from list
public ArrayList getLastNThings(int n);
}
Sonra şöyle bir implementor var:
public GroceryList implements IListable {
private ArrayList<GroceryItem> groceries;
public GroceryList() {
this.groceries = new ArrayList<GroceryItem>();
}
public ArrayList<GroceryItem> getFirstNThings(int n) {
ArrayList<GroceryItem> firstNThings = new ArrayList<GroceryItem>();
for (int i=0; i < n; i++) {
firstNThings.add(this.groceries.get(i));
}
return firstNThings
}
public ArrayList<GroceryItem> getLastNThings(int n) {
ArrayList<GroceryItem> lastNThings = new ArrayList<GroceryItem>();
for (int i=this.groceries.size(); i < this.groceries.size()-n; i--) {
lastNThings.add(this.groceries.get(i-1);
}
return lastNThings;
}
}
Eğer (Ben de birkaç bulundu) ki bulabilirsiniz uygulama sorunlarını görmezden. Ne alıyorum, arabirimin ArrayList (yani ArrayList <?>) Için herhangi bir genel tür parametresi kullanmadığı, ancak arabirimin yönteminin uygulayıcısının (yani ArrayList < GroceryList>) yaptığıdır. Diğer uygulamacılar ArrayList'leri başka tip parametrelere de dönüştürebilirler, değil mi?
Sorularım: Bu bir problem mi? Bir şeyleri tekrar gözden geçirmeli miyim? Buna değer mi? Avantajı nedir? Dönüş tipi ham tip olan bir arabirimde tanımlanmış bir yönteme sahip olsaydım ne tür sorunlar yaşayabilirim, ancak yöntemin gerçek uygulayıcıları çeşitli parametreli türler döndürüyor mu? IListable her iki yöntemler hep aynı tür dönerseniz
Sfussenegger'in ne dediğinin yanı sıra, "ArrayList" yerine "List" i döndürme yöntemlerini tercih ederim. –