Trong Java, bạn nên sử dụng các kiểu giao diện thay vì các lớp cụ thể trong API.
Vấn đề của bạn là bạn đang sử dụng ArrayList
(có thể ở nhiều nơi), nơi bạn thực sự nên sử dụng List
. Kết quả là bạn đã tạo ra các vấn đề cho chính mình với một ràng buộc không cần thiết mà danh sách là một ArrayList
.
Đây là mã của bạn sẽ trông như thế nào:
List input = new ArrayList(...);
public void doSomething(List input) {
List inputA = input.subList(0, input.size()/2);
...
}
this.doSomething(input);
"Giải pháp" được đề xuất của bạn cho vấn đề là / là:
new ArrayList(input.subList(0, input.size()/2))
Điều đó hoạt động bằng cách tạo một bản sao của danh sách phụ. Nó không phải là một lát cắt theo nghĩa thông thường. Hơn nữa, nếu danh sách con lớn, thì việc sao chép sẽ rất tốn kém.
Nếu bạn bị ràng buộc bởi các API mà bạn không thể thay đổi , chẳng hạn như bạn phải khai báo inputA
là một ArrayList
, bạn có thể triển khai một lớp con tùy chỉnh ArrayList
trong đó subList
phương thức trả về một lớp con ArrayList
. Tuy nhiên:
- Sẽ rất nhiều công việc để thiết kế, thực hiện và thử nghiệm.
- Bây giờ bạn đã thêm lớp mới quan trọng vào cơ sở mã của mình, có thể với các phụ thuộc vào các khía cạnh không có tài liệu (và do đó "có thể thay đổi") của
ArrayList
lớp.
- Bạn sẽ cần thay đổi các vị trí có liên quan trong cơ sở mã của mình, nơi bạn đang tạo các
ArrayList
phiên bản để tạo các phiên bản của lớp con thay thế.
Giải pháp "sao chép mảng" thực tế hơn ... lưu ý rằng đây không phải là những lát cắt đúng.
ArrayList
? Tôi nghĩ rằng bạn có thể thiếu một chút hiểu biết về cách thức hoạt động của các giao diện bởi vìList
vàArrayList
không phải là "không tương thích" - cácArrayList
cài đặtList
vàList
có thể chứa tất cả các phương pháp cần thiết mà bạn cần.