Soyutlamalar uygulamalardan daha uzun yaşar
Genel olarak tasarımınız ne kadar soyut olursa faydalı olma ihtimali de o kadar uzun olur. Dolayısıyla, Koleksiyon alt arayüzlerden daha soyut olduğu için, Koleksiyona dayalı bir API tasarımının Liste'ye dayalı bir API tasarımından daha yararlı olma olasılığı daha yüksektir.
Ancak, kapsayıcı prensip en uygun soyutlamayı kullanmaktır . Bu nedenle, koleksiyonunuzun sipariş edilen öğeleri desteklemesi gerekiyorsa, bir Liste zorunlu kılınacaksa, kopyalar yoksa bir Set zorunlu kılınması vb.
Genel arayüz tasarımı hakkında bir not
Koleksiyon arayüzünü jeneriklerle kullanmakla ilgilendiğiniz için aşağıdakileri yardımcı olabilirsiniz. Etkili Java by Joshua Bloch , jeneriklere dayanacak bir arayüz tasarlarken aşağıdaki yaklaşımı önerir: Producers Extend, Consumers Super
Bu aynı zamanda PECS kuralı olarak da bilinir . Temel olarak, veri üreten genel koleksiyonlar sınıfınıza aktarılırsa imza şu şekilde görünmelidir:
public void pushAll(Collection<? extends E> producerCollection) {}
Böylece giriş türü E veya E'nin herhangi bir alt sınıfı olabilir (E, Java dilinde kendisinin hem üst hem de alt sınıfı olarak tanımlanır).
Tersine, veri tüketmek için geçirilen genel bir koleksiyonun aşağıdaki gibi bir imzası olmalıdır:
public void popAll(Collection<? super E> consumerCollection) {}
Yöntem, E'nin herhangi bir süper sınıfıyla doğru bir şekilde ilgilenecektir. Genel olarak, bu yaklaşımı kullanmak arayüzünüzü kullanıcılarınız için daha az şaşırtıcı hale getirecektir, çünkü geçebileceksiniz Collection<Number>
ve Collection<Integer>
doğru şekilde muamele edebileceksiniz .
Collection<List<?>>
mi? Korku kodlama hakkında konuşun!