Mặc dù một số người có thể không ưa "các phương thức tùy chọn", nhưng trong nhiều trường hợp, họ có thể cung cấp ngữ nghĩa tốt hơn so với các giao diện được phân tách cao. Trong số những thứ khác, chúng cho phép các khả năng mà một đối tượng có thể đạt được các khả năng hoặc đặc điểm trong vòng đời của nó, hoặc một đối tượng (đặc biệt là một đối tượng bao bọc) có thể không biết khi nào nó được xây dựng những khả năng chính xác cần báo cáo.
Mặc dù tôi sẽ hầu như không gọi các lớp bộ sưu tập Java là các thiết kế tốt, tôi sẽ đề xuất rằng một khung bộ sưu tập tốt nên bao gồm một số lượng lớn các phương thức tùy chọn cùng với các cách hỏi một bộ sưu tập về các đặc điểm và khả năng của nó . Thiết kế như vậy sẽ cho phép một lớp trình bao bọc duy nhất được sử dụng với nhiều bộ sưu tập lớn mà không vô tình che khuất khả năng mà bộ sưu tập cơ bản có thể sở hữu. Nếu các phương thức không phải là tùy chọn, thì cần phải có một lớp trình bao bọc khác nhau cho mọi kết hợp các tính năng mà các bộ sưu tập có thể hỗ trợ hoặc nếu không, một số trình bao bọc không thể sử dụng được trong một số trường hợp.
Ví dụ: nếu một bộ sưu tập hỗ trợ viết một mục theo chỉ mục hoặc nối thêm các mục ở cuối, nhưng không hỗ trợ chèn các mục ở giữa, thì mã muốn đóng gói nó trong trình bao bọc sẽ ghi lại tất cả các hành động được thực hiện trên đó sẽ cần một phiên bản của trình bao bọc ghi nhật ký được cung cấp cho sự kết hợp chính xác của các khả năng được hỗ trợ hoặc nếu không có sẵn thì sẽ phải sử dụng trình bao bọc hỗ trợ thêm hoặc ghi theo chỉ mục nhưng không phải cả hai. Tuy nhiên, nếu giao diện bộ sưu tập hợp nhất cung cấp cả ba phương thức là "tùy chọn", nhưng sau đó bao gồm các phương thức để chỉ ra phương thức tùy chọn nào có thể sử dụng được, thì một lớp trình bao bọc duy nhất có thể xử lý các bộ sưu tập thực hiện bất kỳ kết hợp tính năng nào. Khi được hỏi những tính năng nào nó hỗ trợ, trình bao bọc có thể chỉ báo cáo bất cứ điều gì bộ sưu tập được đóng gói hỗ trợ.
Lưu ý rằng trong một số trường hợp, sự tồn tại của "các khả năng tùy chọn" có thể cho phép các bộ sưu tập tổng hợp thực hiện các chức năng nhất định theo cách hiệu quả hơn nhiều so với khả năng nếu các khả năng được xác định bởi sự tồn tại của việc triển khai. Ví dụ: giả sử một concatenate
phương thức được sử dụng để tạo thành một bộ sưu tập tổng hợp từ hai phương thức khác, trong đó phương thức đầu tiên là ArrayList với 1.000.000 phần tử và phần cuối là bộ sưu tập hai mươi phần tử chỉ có thể được lặp lại từ đầu. Nếu bộ sưu tập tổng hợp được yêu cầu cho phần tử thứ 1.000.013 (chỉ số 1.000.012), nó có thể hỏi ArrayList có bao nhiêu mục (ví dụ 1.000.000), trừ đi chỉ số được yêu cầu (đạt 12), đọc và bỏ qua mười hai phần tử từ phần tử thứ hai bộ sưu tập, và sau đó trả về phần tử tiếp theo.
Trong tình huống như vậy, mặc dù bộ sưu tập tổng hợp sẽ không có cách trả lại một mục ngay lập tức theo chỉ mục, yêu cầu bộ sưu tập tổng hợp cho mục thứ 1.000.013 vẫn sẽ nhanh hơn nhiều so với việc đọc riêng lẻ 1.000.013 và bỏ qua tất cả trừ mục cuối cùng một.