Salah satu masalah adalah bahwa dalam banyak kasus, kunci untuk tabel hash adalah string. Jadi konsumen metode harus tahu sebelumnya kunci mana yang digunakan untuk mengekstraksi data. Ini akan memberikan potensi kesalahan karena kesalahan ejaan saat mengakses data.
Kelemahan lain adalah refactorability. Jika Anda kemudian memutuskan untuk mengubah nama anggota, Anda kemudian memiliki banyak string sihir yang juga perlu diubah. Jauh lebih mudah untuk mengganti nama anggota kelas menggunakan alat refactoring yang disediakan oleh sebagian besar IDE yang bagus. Dengan tabel hash Anda mungkin harus melakukan operasi find / replace di semua file sumber yang mungkin bermasalah.
Terakhir, Anda akan kehilangan waktu kompilasi untuk memeriksa akses anggota - baik dari segi nama dan jenis. Yang terakhir ini tidak menjadi masalah jika tabel hash Anda hanya berisi satu jenis obejct, tetapi jika berisi banyak (bahkan dalam rantai hierarki yang sama) Anda benar-benar ingin memanfaatkan sistem tipe bahasa Anda dan mendapatkan waktu kompilasi memeriksa di sana. Di sebagian besar IDE, Anda akan memiliki beberapa fitur intellisense / autocomplete - ini bekerja dengan melihat pada sistem tipe, tetapi mereka tidak akan dapat membantu Anda dengan kunci tabel hash.
Adapun saat-saat ketika akan tepat untuk mengembalikan tabel hash (atau kumpulan pasangan nilai kunci lainnya), Anda akan menggunakan ini ketika nilai dan kunci tidak diketahui pada waktu kompilasi. Misalnya, jika Anda memiliki metode yang mem-parsing string kueri dan mengembalikan kunci & nilai yang sesuai, tabel hash akan menjadi pilihan yang baik. Dalam hal ini Anda juga ingin berpikir tentang mengembalikan semacam tabel hash yang tidak berubah atau hanya baca.
Sunting - Sebagian besar poin yang diangkat dalam jawaban ini berhenti berlaku ketika Anda berbicara tentang bahasa dinamis :)