グローバルはそれほど悪くはありません。他のいくつかの回答で述べたように、それらの本当の問題は、今日のグローバルフォルダーパスが、明日、数個または数百個のいずれかになることです。簡単な1回限りのプログラムを書いている場合は、簡単であればグローバルを使用してください。ただし、一般に、必要なのは1つだけだと思っている場合でも複数を許可するのがよいでしょう。突然2つのデータベースと通信する必要がある大規模で複雑なプログラムを再構築しなければならないのは気持ちの悪いことです。
しかし、それらは信頼性を傷つけません。どれもが予期せず変更された場合、プログラムの多くの場所から参照されるデータは、問題を引き起こす可能性があります。列挙子は、列挙中のコレクションが列挙の途中で変更されると停止します。イベントキューイベントは、互いにトリックを行うことができます。スレッドは常に大混乱を招く可能性があります。ローカル変数でも変更不可能なフィールドでもないものはすべて問題です。グローバルはこの種の問題ですが、グローバルではないことでそれを修正するつもりはありません。
ファイルに書き込もうとしてフォルダパスが変更された場合、変更と書き込みを同期する必要があります。(うまくいかない可能性のあるものの1つとして、パスを取得すると、そのディレクトリが削除され、フォルダーパスが適切なディレクトリに変更され、削除されたディレクトリに書き込もうとします。)フォルダーパスはグローバルであるか、プログラムが現在使用している1000の1つです。
キューのさまざまなイベント、さまざまなレベルの再帰、またはさまざまなスレッドによってアクセスできるフィールドには、実際の問題があります。単純(かつ単純化)にするには、ローカル変数は適切でフィールドは悪いです。しかし、以前のグローバルは依然としてフィールドであるため、この(非常に重要ですが)問題はグローバルフィールドの良い状態または悪い状態には適用されません。
追加:マルチスレッドの問題:
(イベントキューや再帰呼び出しでも同様の問題が発生する可能性がありますが、マルチスレッドは最悪です。)次のコードを検討してください。
if (filePath != null) text = filePath.getName();
場合はfilePath
、ローカル変数や定数のいくつかの種類である、あなたのプログラムがされていないので、実行するときに失敗するつもりはfilePath
nullです。チェックは常に機能します。他のスレッドはその値を変更できません。 それ以外の場合、保証はありません。Javaでマルチスレッドプログラムを書き始めたとき、このような行でNullPointerExceptionsが常に発生していました。 どれか他のスレッドはいつでも値を変更できますが、頻繁に変更します。他のいくつかの回答が指摘しているように、これはテストに深刻な問題を引き起こします。上記のステートメントは数十億回動作し、広範囲にわたる包括的なテストを経て、本番環境で一度爆発します。ユーザーは問題を再現することができず、物事を見ていると忘れてしまったと確信するまで、それは二度と起こりません。
グローバルには間違いなくこの問題があり、それらを完全に削除するか、定数またはローカル変数に置き換えることができる場合、それは非常に良いことです。Webサーバーでステートレスコードを実行している場合は、おそらく可能です。通常、すべてのマルチスレッドの問題はデータベースで処理できます。
しかし、あるユーザーアクションから次のユーザーアクションまでをプログラムで記憶する必要がある場合、実行中のスレッドからアクセス可能なフィールドがあります。グローバルをそのような非グローバルフィールドに切り替えても、信頼性は向上しません。