Cho đến khi tác giả của Java string.indexOf
cho chúng ta biết lịch sử thực tế ...
Giả sử chúng ta phải thiết kế nó từ đầu, một số hạn chế về thiết kế rõ ràng cho vấn đề này:
indexOf
phải trả lại một giá trị số, để khi tìm thấy kết quả phù hợp, bạn biết vị trí của nó là
- chỉ mục hợp lệ được đảm bảo luôn là số nguyên
- chỉ mục mảng (và chuỗi) không dựa trên Java
- Java được mạnh mẽ gõ
- số nguyên kiểu dữ liệu được ký kết trong Java
Với những hạn chế cơ bản, một số lựa chọn có thể cho chức năng quay trở lại gõ sẽ là số nguyên (lý tưởng của một loại đủ lớn để đại diện cho chỉ mục cuối cùng trong chuỗi có thể lớn nhất), HOẶC ... Object
(và có thể trả về null để chỉ ra không tìm thấy).Nhưng trong thực tế trả lại Object
sẽ không hiệu quả và cũng không thân thiện với người dùng, do cần kiểm tra tính hợp lệ của nó và truyền trước khi sử dụng cho trường hợp tìm thấy - vì vậy nó không thực sự là một lựa chọn khả thi!
Vì vậy, hãy đi với một số nguyên. Chúng ta có muốn ném một ngoại lệ nếu không tìm thấy? Ném ngoại lệ có nhiều vấn đề của riêng nó - tạo ra các đối tượng ngoại lệ và nhảy tới các trình xử lý ngoại lệ có thể khá kém hiệu quả, và viết các khối try/catch xung quanh các cuộc gọi indexOf
cũng không vui!
Vì vậy, giả sử chúng tôi đã thu hẹp nó xuống: nó phải trả lại một loại số nguyên (đã ký) và không ném một ngoại lệ. Bây giờ giá trị số nguyên nào sẽ trở lại để biểu diễn không tìm thấy?
Để cho phép tìm kiếm trong chuỗi càng lớn càng tốt, chúng tôi nên đặt trước tất cả các số nguyên dương cho việc sử dụng như ý nghĩa tìm thấy thành công. Ngược lại, không có số âm nào là cần thiết để biểu thị chỉ mục 'tìm thấy', vì vậy tất cả đều có khả năng sử dụng làm mã trả về đại diện cho 'không tìm thấy'.
Nếu chúng tôi có thể chọn bất kỳ số âm nào, đại diện cho không tìm thấy hoặc chỉ nói 'tất cả giá trị trả về tiêu cực có nghĩa là không tìm thấy' nó sẽ thực hiện công việc ... Nhưng đó có phải là thiết kế tốt nhất không?
Một số lý do để sử dụng -1 thay vì các số âm khác là gì? Lý do yêu thích của tôi đơn giản là '-1 rất dễ để mọi người nhớ, và bạn có thể thực hiện các bài kiểm tra bình đẳng chính xác trên đó'. (Thay vì bị buộc phải sử dụng sự bất bình đẳng và suy nghĩ về các vấn đề off-by-one như bạn muốn ít hơn hoặc ít hơn hoặc bằng nhau, và giá trị nào để so sánh, không hoặc tiêu cực)
I đôi khi cũng ngưỡng mộ lý do của Chris rằng (diễn giải) 'nó hoạt động độc đáo với substring(foundIndex + 1)
'.
Như bạn có thể thấy từ các câu trả lời, không ai nghĩ rằng nó phải là một ngoại lệ. Hãy tự hỏi, nếu nó trả về Integer thay cho int, bạn có mong đợi nó trả về null hay ném một ngoại lệ. Vì nó là một nguyên thủy, null không có sẵn như là một kiểu trả về, do đó -1 được sử dụng để thay thế. – Robin
nếu nó trả về đối tượng Integer. null là có thể. tham khảo MSFT.net 2.0, int? là giải pháp tốt – ariso