Tôi có một tình huống bất ngờ trong một dự án trong đó tất cả các kiểu mở rộng một lớp được đóng gói vào một bộ sưu tập Java; nhưng chỉ một phần mở rộng cụ thể của lớp đó chứa một phương thức bổ sung. Hãy gọi nó là "cũng ()"; và để tôi nói rõ rằng không có phần mở rộng nào khác có nó. Ngay trước khi thực hiện một nhiệm vụ trên mỗi mục trong bộ sưu tập đó, tôi cũng cần gọi () trên mỗi mục thực hiện nó.
Cách dễ nhất về phía trước là đây:
stuff.stream().filter(item -> item instanceof SpecificItem)
.forEach(item -> ((SpecificItem)item).also()));
stuff.stream().forEach(item -> item.method());
Nó hoạt động tốt, nhưng tôi không thoải mái với "instanceof" trong đó. Đó thường là một dấu hiệu của mùi mã xấu. Rất có khả năng tôi sẽ cấu trúc lại lớp này chỉ để loại bỏ nó. Tuy nhiên, trước khi tôi làm điều gì đó ấn tượng, tôi nghĩ rằng tôi sẽ kiểm tra với cộng đồng và xem liệu ai đó có nhiều kinh nghiệm hơn với Luồng hoặc Bộ sưu tập có giải pháp đơn giản hơn không.
Như một ví dụ (chắc chắn không có kết luận), có thể có được chế độ xem bộ sưu tập lọc các mục theo lớp không?
.getKind()
hay .isSpecific()
?
SpecificItem
việc triển khai không chỉ gọi also()
trước sau đó?
Iterable
không có stream()
phương pháp, nhưng bạn có thể gọi forEach()
trực tiếp trên Iterable
.
SpecificItem
và đây là cách thích hợp để xác định vị ngữ, vậy tại sao bạn lại lúng túng về sựinstanceof
tồn tại ở đó?