Global tidak seburuk itu. Seperti yang dinyatakan dalam beberapa jawaban lain, masalah sebenarnya dengan mereka adalah bahwa apa, hari ini, jalur folder global Anda , besok, bisa menjadi salah satu dari beberapa, atau bahkan ratusan. Jika Anda menulis program cepat, sekali pakai, gunakan global jika lebih mudah. Namun, secara umum, memungkinkan untuk melipatgandakan bahkan ketika Anda hanya berpikir bahwa Anda membutuhkannya adalah cara untuk melakukannya. Tidak menyenangkan harus merestrukturisasi program kompleks besar yang tiba-tiba perlu berbicara dengan dua database.
Tetapi mereka tidak merusak keandalan. Setiap data yang dirujuk dari banyak tempat dalam program Anda dapat menyebabkan masalah jika perubahan tiba-tiba. Enumerator tersedak ketika koleksi yang mereka hitung diubah pada pertengahan enumerasi. Peristiwa antrian acara dapat memainkan trik satu sama lain. Utas selalu dapat mendatangkan kekacauan. Apa pun yang bukan variabel lokal atau bidang yang tidak dapat diubah adalah masalah. Global adalah masalah semacam ini, tetapi Anda tidak akan memperbaikinya dengan menjadikannya non-global.
Jika Anda akan menulis ke file dan jalur folder berubah, perubahan dan penulisan harus disinkronkan. (Sebagai salah satu dari seribu hal yang bisa salah, katakan Anda ambil jalurnya, lalu direktori itu dihapus, lalu jalur folder diubah ke direktori yang baik, lalu Anda coba dan tulis ke direktori yang dihapus.) Masalahnya ada apakah jalur folder bersifat global atau merupakan salah satu dari seribu program yang saat ini digunakan.
Ada masalah nyata dengan bidang yang dapat diakses oleh berbagai peristiwa pada antrian, tingkat rekursi yang berbeda, atau utas berbeda. Untuk membuatnya sederhana (dan sederhana): variabel lokal baik dan bidang buruk. Tetapi para mantan global masih akan menjadi ladang, jadi masalah ini (betapapun pentingnya) tidak berlaku untuk status Baik atau Jahat bidang-bidang Global.
Tambahan: Masalah Multithreading:
(Perhatikan bahwa Anda dapat memiliki masalah serupa dengan antrian acara atau panggilan rekursif, tetapi multithreading sejauh ini adalah yang terburuk.) Pertimbangkan kode berikut:
if (filePath != null) text = filePath.getName();
Jika filePath
adalah variabel lokal atau semacam konstan, program Anda tidak akan gagal ketika berjalan karena filePath
nol. Pemeriksaan selalu berhasil. Tidak ada utas lain yang dapat mengubah nilainya. Kalau tidak , tidak ada jaminan. Ketika saya mulai menulis program multithreaded di Java, saya mendapat NullPointerExceptions pada baris seperti ini sepanjang waktu. Apa sajautas lainnya dapat mengubah nilai kapan saja, dan sering kali demikian. Seperti yang ditunjukkan beberapa jawaban lainnya, ini menciptakan masalah serius untuk pengujian. Pernyataan di atas dapat bekerja satu miliar kali, mendapatkannya melalui pengujian yang luas dan komprehensif, kemudian meledak sekali dalam produksi. Pengguna tidak akan dapat mereproduksi masalah, dan itu tidak akan terjadi lagi sampai mereka meyakinkan diri sendiri bahwa mereka melihat sesuatu dan melupakannya.
Global pasti memiliki masalah ini, dan jika Anda dapat menghilangkannya sepenuhnya atau menggantinya dengan konstanta atau variabel lokal, itu adalah hal yang sangat bagus. Jika Anda memiliki kode stateless yang berjalan di server web, Anda mungkin bisa. Biasanya, semua masalah multithreading Anda dapat diambil oleh database.
Tetapi jika program Anda harus mengingat hal-hal dari satu tindakan pengguna ke tindakan berikutnya, Anda akan memiliki bidang yang dapat diakses oleh utas yang berjalan. Mengubah global ke bidang non-global tidak akan membantu keandalan.