Một trong những vấn đề là trong nhiều trường hợp, khóa cho bảng băm sẽ là một chuỗi. Vì vậy, người tiêu dùng của phương pháp sẽ phải biết trước khi sử dụng khóa nào để trích xuất dữ liệu. Điều này sẽ tạo ra khả năng xảy ra lỗi do lỗi chính tả khi truy cập dữ liệu.
Một nhược điểm khác là khả năng tái cấu trúc. Nếu sau đó bạn quyết định thay đổi tên của một thành viên, thì bạn có một chuỗi các chuỗi ma thuật cũng cần phải thay đổi. Việc đổi tên một thành viên trong lớp bằng cách sử dụng các công cụ tái cấu trúc được cung cấp bởi hầu hết các IDE tốt là rất đơn giản. Với bảng băm, bạn có thể phải thực hiện thao tác tìm / thay thế trên tất cả các tệp nguồn có thể có vấn đề.
Cuối cùng, bạn sẽ mất thời gian biên dịch kiểm tra quyền truy cập của thành viên - cả về tên và loại. Điều thứ hai không phải là vấn đề như vậy nếu bảng băm của bạn chỉ chứa một loại obejct, nhưng nếu nó chứa nhiều (ngay cả trong cùng một chuỗi phân cấp), bạn thực sự muốn tận dụng hệ thống loại ngôn ngữ của mình và kiểm tra thời gian biên dịch ở đó. Trong hầu hết các IDE, bạn sẽ có một số loại tính năng intellisense / autocomplete - những tính năng này hoạt động bằng cách xem hệ thống loại, nhưng chúng sẽ không thể giúp bạn với các phím bảng băm.
Đối với lần khi nó sẽ là thích hợp để trả về một bảng băm (hoặc bộ sưu tập ví dụ khác của các cặp giá trị key), bạn sẽ sử dụng điều này khi cả các giá trị và các phím không được biết đến tại thời gian biên dịch. Ví dụ: nếu bạn có một phương pháp phân tích chuỗi truy vấn và trả về các khóa & giá trị tương ứng, thì bảng băm sẽ là một lựa chọn tốt. Trong trường hợp này, bạn cũng sẽ muốn nghĩ về việc trả về một loại bảng băm bất biến hoặc chỉ đọc.
Chỉnh sửa - Hầu hết các điểm nêu trong câu trả lời này sẽ ngừng áp dụng khi bạn nói về ngôn ngữ động :)