こんにちは!この記事では、グローバル変数、その宣言、および適切な使用例について説明します。ちょっとした注意: グローバル クラス変数、つまり 1 つのクラス内でアクセスできる変数については考慮しません。アプリケーション全体のグローバル変数、つまりアプリケーション全体内でアクセスできるグローバル変数について説明します。
グローバル変数の作成方法
グローバル変数は、アプリケーション内のどこからでもアクセスできる変数です。言い換えれば、その範囲はアプリケーション全体です。Java でこのような変数を作成するには、パブリック クラスでパブリック静的変数を作成する必要があります。public class Example {
public static int a;
public static int b;
public static String str;
}
変数a
と-b
はstr
グローバルになりました。アプリケーション内の他のクラスから直接アクセスできます。
public class GlobalVarsDemo {
public static void main(String[] args) {
Example.a = 4;
Example.b = 5;
Example.str = "Global String variable value";
System.out.println(Example.a);
System.out.println(Example.b);
System.out.println(Example.str);
}
}
メソッドを実行するとmain
、次の出力が表示されます。
4
5
Global String variable value
グローバル変数は 2 つのタイプに分類できます。
- 編集可能な変数。
- 読み取りのみ可能な変数。
final
、変数の定義時に値を割り当てる必要があります。
public class Constants {
public static final double PI = 3.1415926535897932384626433832795;
public static final String HELLO_WORLD_STR = "Hello, World!";
}
Java の命名規則に従って、すべての定数は大文字で名前を付け、単語をアンダースコア文字で区切る必要があります。したがって、定数を作成しましたが、その値を変更することはできません。ただし、その値を読み取ることはできます。
public class HelloWorld {
public static void main(String[] args) {
System.out.println(Constants.HELLO_WORLD_STR);
}
}
結論:
Hello, World!
public class ConstantsDemo {
public static void main(String[] args) {
double r = 10;
String message = String.format("Площадь круга с радиусом %f=%f", r, getCircleSquare(r));
System.out.println(message);
}
static double getCircleSquare(double r) {
return Constants.PI * r * r;
}
}
結論:
Площадь круга с радиусом 10,000000=314,159265
グローバル変数を使用する必要がありますか?
インターネット上には多くの記事がありますが、その主なメッセージは次のとおりです。グローバル変数は悪であり、悪であり、恐ろしいものです。本当か?誰もが独自の結論を出せるように、グローバル変数の長所と短所を示してみましょう。短所から始めましょう。読み取りと編集が可能なグローバル変数を持つクラスを持つアプリケーションを想像してみましょう。時間の経過とともに、プロジェクト内のクラスの数、グローバル変数、およびグローバル変数を使用する、つまりグローバル変数に依存するメソッドの数が増加します。時間の経過とともに、各グローバル変数は、さまざまな目的でシステムのさまざまな部分で読み取られます。システムのさまざまな部分で、変数の値を更新できます。このアプリケーションの世界の全体像は大幅に複雑になり、これにより次のような欠点が生じます。- 可読性が低下し、コードを理解することが難しくなります。
- コードのメンテナンスが複雑になります。
- 1 つのグローバル変数を変更するには、その変数がシステムの他の部分にとって無効な値に設定されないように、コード全体を分析する必要があります。
- デバッグが非常に困難なエラーが増加します。
オブジェクトの配列であるグローバル変数を想像してみましょう。たとえば、システムのある部分では、この配列には文字列が必要ですが、システムの別の部分では、誰かが浮動小数点数を使用することを決定しました。これを理解したい人はおそらくいないでしょう。
- コード内でグローバル変数を使用する場合や、同様にグローバル変数を使用する一部のライブラリでも変数名が同じになることがあります。これにより、アプリケーション側と使用しているライブラリ側の両方でエラーが発生する可能性があります。
- グローバル変数を使用するシステムのさまざまな部分間の接続を強化します。逆に、コードの疎結合を目指す必要があります。大きなものを 1 つ持つよりも、多数の小さなサブシステムを相互に緩やかに接続する方が良いでしょう。なぜなら、複雑すぎてわかりにくいものを 1 つ扱うよりも、いくつかの単純なものを処理するほうが脳にとっては簡単だからです。
- テストではどのグローバル変数が必要か、どのように初期化する必要があるかがわからないため、単体テストの作成はさらに困難になります。
- マルチスレッド アプリケーションでは、異なるスレッドでグローバル変数を使用すると、デバッグが困難なエラーが増加し、プロジェクトが複雑になります。このため、そのような変数へのアクセスをより正確に構成し、同期とロックを装備する必要があります。これにより、将来的にショートが発生する可能性があります。たとえば、スレッド A はその作業のために変数 X をロックし、スレッド B はその作業のために変数 Y をロックしました。そして、スレッド A は変数 Y を必要とし、スレッド B は変数 X を必要とします。その結果、プログラムはフリーズします。
- 小規模プロジェクトでは、プロジェクトを機能させるための最も簡単な方法はグローバル変数です。
- 場合によっては、グローバル変数を使用することへの不安がプロジェクトをさらに複雑にすることがあります。その後、プログラマはシングルトンを作成し、他の設計パターンに頼るようになります。
- プログラミングでは、多くの場合、いくつかの不変の値に依存する必要があります。
変数の値が時間の経過とともに変化しないことを保証できるのは定数だけであるため、最も合理的なのは、そのような値を定数として記述することです。このような定数は常に見つかります (
Integer.MAX_VALUE
、Integer.MIN_VALUE
、Boolean.TRUE
などCollections.EMPTY_LIST
)。ただし、プログラミングは標準ライブラリの使用に限定されません。独自の定数に依存する必要がある、ある種の独自のロジックを記述する必要があることがよくあります。このため、定数 (読み取り専用のグローバル変数) を使用すると作業が非常に楽になる場合があります。
- 初心者の開発者が作成するものはすべて、基本的には小さなプロジェクトです。そして、プロジェクトでグローバル変数を使用することで、どこでもグローバル変数を使用できるようになります。
- まずは「禁じられた技」を使わずにできるようになることをお勧めします。そして経験を積めば、いつそのようなテクニックを使用するのが適切であるかが自然に理解できるようになります。
GO TO FULL VERSION