Có một quyết định thiết kế để sớm đưa ra trong Java:
Là mảng nguyên thủy? hoặc họ là đối tượng?
Câu trả lời là, không thực sự ... hoặc cả hai nếu bạn nhìn nó theo một cách khác. Họ làm việc khá chặt chẽ với chính hệ thống và phụ trợ của jvm.
Một ví dụ về điều này là phương thức java.lang.System.arraycopy () cần lấy một mảng thuộc bất kỳ loại nào. Vì vậy, mảng cần có khả năng kế thừa một cái gì đó và đó là một Object. Và mảng là một phương pháp bản địa.
Mảng cũng hài hước ở chỗ chúng có thể giữ nguyên thủy ( int
, char
, double
, vv ... trong khi các bộ sưu tập khác chỉ có thể giữ các đối tượng. Hãy nhìn xem, ví dụ, tại java.util.Arrays và xấu xí của bằng phương pháp này. Điều này đã được đưa vào như một suy nghĩ sau. DeepEquals (Object [], Object []) không được thêm cho đến 1.5 trong khi phần còn lại của lớp Arrays được thêm vào 1.2.
Vì các đối tượng này là mảng , chúng cho phép bạn thực hiện một số thứ ở mức bộ nhớ hoặc gần mức bộ nhớ - thứ mà Java thường ẩn khỏi bộ mã hóa. Điều này cho phép một số điều được thực hiện nhanh hơn với chi phí chủ yếu là phá vỡ mô hình đối tượng.
Có một sự đánh đổi sớm trong hệ thống giữa tính linh hoạt và một số hiệu suất. Hiệu suất đã thắng và sự thiếu linh hoạt được gói gọn trong các bộ sưu tập khác nhau. Mảng trong Java là một Đối tượng được triển khai mỏng trên đầu loại nguyên thủy (ban đầu) dành cho làm việc với hệ thống khi bạn cần.
Đối với hầu hết các phần, mảng thô là những thứ mà dường như các nhà thiết kế ban đầu đã cố gắng bỏ qua và chỉ giấu trong hệ thống. Và họ muốn nó nhanh (Java ban đầu có một số vấn đề về tốc độ). Đó là một mụn cóc trên thiết kế mà mảng không phải là Mảng đẹp, nhưng đó là thứ cần thiết khi bạn muốn phơi bày thứ gì đó càng gần hệ thống càng tốt. Đối với vấn đề đó, các ngôn ngữ đương đại của Java thời kỳ đầu cũng có vấn đề này - người ta không thể thực hiện một .equals()
mảng trên C ++.
Cả Java và C ++ đều có cùng một đường dẫn cho mảng - một thư viện bên ngoài thực hiện các hoạt động cần thiết trên mảng thay vì Mảng ... và đề nghị các lập trình viên sử dụng các kiểu nguyên gốc tốt hơn trừ khi họ thực sự biết họ đang làm gì và tại sao họ lại làm làm theo cách đó
Do đó, cách tiếp cận cấy .equals trong một mảng là sai, nhưng nó cũng sai tương tự mà các lập trình viên đến từ C ++ biết. Vì vậy, đã chọn điều sai ít nhất về mặt hiệu suất - hãy để nó là việc triển khai Đối tượng: hai Đối tượng bằng nhau khi và chỉ khi chúng được đề cập đến cùng một đối tượng.
Bạn cần mảng phải là một cấu trúc giống như nguyên thủy để có thể giao tiếp với các ràng buộc riêng - một cái gì đó càng gần với mảng C cổ điển càng tốt. Nhưng không giống như các nguyên thủy khác, bạn cần mảng để có thể được chuyển qua làm tham chiếu, và do đó, là một Đối tượng. Vì vậy, nó còn hơn cả nguyên thủy với một số hack Object ở bên cạnh và một số giới hạn kiểm tra.