Während einige Leute "optionale Methoden" hassen, bieten sie in vielen Fällen eine bessere Semantik als stark getrennte Schnittstellen. Unter anderem berücksichtigen sie die Möglichkeiten, dass ein Objekt im Laufe seiner Lebensdauer Fähigkeiten oder Eigenschaften erhält oder dass ein Objekt (insbesondere ein Wrapper-Objekt) möglicherweise nicht weiß, wann es konstruiert wurde, über welche genauen Fähigkeiten es berichten soll.
Während ich die Java-Collection-Klassen kaum als Paragone für gutes Design bezeichnen werde, würde ich vorschlagen, dass ein gutes Collections-Framework eine große Anzahl optionaler Methoden sowie Möglichkeiten enthält, eine Collection nach ihren Eigenschaften und Fähigkeiten zu befragen . Mit einem solchen Entwurf kann eine einzelne Wrapper-Klasse mit einer Vielzahl von Sammlungen verwendet werden, ohne dass versehentlich die Fähigkeiten der zugrunde liegenden Sammlung beeinträchtigt werden. Wenn Methoden nicht optional wären, müsste für jede Kombination von Features, die Auflistungen möglicherweise unterstützen, eine andere Wrapper-Klasse verwendet werden. In bestimmten Situationen könnten einige Wrapper nicht verwendet werden.
Wenn eine Auflistung beispielsweise das Schreiben eines Elements nach Index oder das Anhängen von Elementen am Ende unterstützt, das Einfügen von Elementen in der Mitte jedoch nicht unterstützt, ist für den Code, der es in einen Wrapper einschließen möchte, der alle auf ihm ausgeführten Aktionen protokolliert, eine Version erforderlich des Protokollierungs-Wrappers, der die genaue Kombination der unterstützten Fähigkeiten bereitstellte, oder wenn keiner verfügbar war, müsste ein Wrapper verwendet werden, der entweder Anhängen oder Schreiben nach Index, aber nicht beides unterstützt. Wenn jedoch eine vereinheitlichte Erfassungsschnittstelle alle drei Methoden als "optional" bereitstellte, dann aber Methoden enthielt, um anzugeben, welche der optionalen Methoden verwendet werden könnten, könnte eine einzelne Wrapper-Klasse Auflistungen verarbeiten, die eine beliebige Kombination von Funktionen implementieren. Auf die Frage, welche Funktionen unterstützt werden, könnte ein Wrapper einfach melden, was auch immer die gekapselte Sammlung unterstützt.
Es ist zu beachten, dass das Vorhandensein von "optionalen Fähigkeiten" in einigen Fällen ermöglichen kann, dass aggregierte Sammlungen bestimmte Funktionen auf eine Weise implementieren, die viel effizienter ist, als dies möglich wäre, wenn Fähigkeiten durch das Vorhandensein von Implementierungen definiert würden. Angenommen, eine concatenate
Methode wurde verwendet, um eine zusammengesetzte Auflistung aus zwei anderen zu bilden, wobei die erste zufällig eine ArrayList mit 1.000.000 Elementen und die letzte eine Auflistung mit zwanzig Elementen war, die nur von Anfang an iteriert werden konnte. Wenn die zusammengesetzte Auflistung nach dem 1.000.013sten Element (Index 1.000.012) gefragt würde, könnte sie die ArrayList nach der Anzahl der enthaltenen Elemente (dh 1.000.000) fragen, diese vom angeforderten Index subtrahieren (Ergebnis 12), zwölf Elemente auslesen und überspringen Auflistung, und geben Sie dann das nächste Element zurück.
In einer solchen Situation wäre es, obwohl die zusammengesetzte Sammlung keine unmittelbare Möglichkeit hätte, ein Element nach Index zurückzugeben, viel schneller, die zusammengesetzte Sammlung nach dem 1.000.013sten Element zu fragen, als 1.000.013 Elemente einzeln auszulesen und alle außer den letzten zu ignorieren einer.