Bazı insanlar "isteğe bağlı yöntemler" den nefret ederken, çoğu durumda yüksek düzeyde ayrılmış arayüzlerden daha iyi anlambilim sunabilirler. Diğer şeylerin yanı sıra, bir nesnenin yaşamı boyunca yetenek veya özellik kazanması ya da bir nesnenin (özellikle sarıcı nesne) ne zaman hangi yetenekleri rapor etmesi gerektiğini bilmediği ihtimallerine izin verir.
Java koleksiyon sınıflarına iyi tasarım paragonlarını pek çağıracak olsam da, iyi bir koleksiyonlar çerçevesinin temelinde , özellikleri ve yetenekleri hakkında bir koleksiyon sorma yolları ile birlikte çok sayıda isteğe bağlı metot içermesi gerektiğini öneririm . Böyle bir tasarım, altta yatan koleksiyonun sahip olabileceği kabiliyetleri engellemeden tek bir sarmalayıcı sınıfının çok çeşitli koleksiyonlarla kullanılmasına izin verecektir. Yöntemler isteğe bağlı olmasaydı, koleksiyonların destekleyebileceği özelliklerin her birleşimi için farklı bir sarmalayıcı sınıfının olması ya da bazı durumlarda bazı sarmalayıcıların kullanılamaz olması gerekirdi.
Örneğin, bir koleksiyon bir öğeyi dizine göre yazmayı veya sonunda öğe eklemeyi destekliyorsa, ancak ortadaki öğeleri eklemeyi desteklemiyorsa, bunun üzerinde gerçekleştirilen tüm eylemleri günlüğe kaydedecek bir paketleyiciye kapsüllemek isteyen kod bir sürüme ihtiyaç duyacak Desteklenen yeteneklerin tam bir kombinasyonunu sağlayan veya hiçbiri mevcut değilse, günlüğe kaydetme paketleyicisinin ya eklenmiş ya da indeks yazmış ya da ikisini birden desteklemeyen bir sarıcı kullanması gerekirdi. Bununla birlikte, birleşik bir toplama arayüzü, üç yöntemi de "isteğe bağlı" olarak sağladıysa, ancak isteğe bağlı yöntemlerden hangisinin kullanılabileceğini belirten yöntemler içeriyorsa, tek bir sarmalayıcı sınıfı, herhangi bir özellik kombinasyonunu uygulayan koleksiyonları kaldırabilir. Hangi özellikleri desteklediği sorulduğunda, bir sarmalayıcı, kapsüllenmiş koleksiyonun desteklediği her şeyi yalnızca rapor edebilir.
"İsteğe bağlı yeteneklerin" varlığının bazı durumlarda toplanmış koleksiyonların, yeteneklerin uygulamaların varlığıyla tanımlanması durumunda mümkün olacağından çok daha etkili şekilde bazı işlevlerin uygulanmasına izin verebileceğini unutmayın. Örneğin, iki concatenate
yöntemden oluşan karma bir koleksiyon oluşturmak için bir yöntemin kullanıldığını varsayalım . Bunlardan ilki 1.000.000 elementten oluşan bir ArrayList'tir ve sonuncusu yalnızca baştan itibaren yinelenebilen yirmi elementli bir koleksiyondu. Kompozit koleksiyona 1.000.013. Elementten (endeks 1.000.012) istendiyse, ArrayList'e kaç tane madde içerdiğini (yani 1.000.000) sorabilirdi, bunu istenen dizinden çıkar (12'ye kadar), ikinci on iki elementi oku ve atla toplama ve sonra bir sonraki öğeye dönün.
Böyle bir durumda, kompozit koleksiyonun bir maddeyi indeksle geri döndürme anında bir yolu olmasa da, kompozit koleksiyonun 1.000.013. Maddeden istenmesi, ondan 1.000.013 maddeyi tek tek okumak ve sonuncusu yok saymaktan çok daha hızlı olacaktır. bir.