グローバル変数
日本語 | 広域変数 |
英語 | global variable |
ふりがな | ぐろーばるへんすう |
フリガナ | グローバルヘンスウ |
プログラムのあらゆるところからアクセスできる変数のこと。
スコープにも寿命にも束縛されず、プログラムのあらゆる箇所から自由にアクセスできる変数を「グローバル変数」と呼ぶ。
Javaでは、厳密な意味でのグローバル変数は存在しない。
Javaの変数は、メソッド内の「ローカル変数」か、クラスの内の「フィールド」しか存在しないためである。
ただし、擬似的なグローバル変数を作ることはできる。publicクラスのフィールドをpublicフィールドでかつstaticフィールドとすることで、あらゆる箇所からアクセスできる変数となる。ただしfinalフィールドの場合には「定数」となるため疑似グローバル変数とはならない。
疑似グローバル変数は決して使用してはならない。
変数は、アクセスできる範囲が広まれば広まるほど、プログラマーが気を付けなければならない範囲が広がる。範囲が広がれば広がるほど注意しきれなくなり、バグが生まれる確率が高くなる。
また、こうして作られたプログラムは、得てして「一人の人間の脳内におけるプログラムの管理」によってのみ変数の管理が行われている。「このフィールドはAクラスのb()メソッドでしかアクセスしてないし、それ以外のクラスからはアクセスさせない」といった注意がそのプログラマーの頭の中にしかない場合、完成しリリース後に別の人員がメンテナンスする場合に最悪の結果を迎える。
ローカル変数を使用し、フィールドもstatic finalフィールド以外は全てprivateフィールドとすることが望ましい。そうすることで使用される範囲を最小限にすることができるためである。
グローバル変数は、旧来のプログラムでは一般的であった。
その「旧来のプログラム」をJavaで作り直す(リプレースする)プロジェクトの場合、工費削減のため得てして「旧来のプログラムをそのままJavaに置き換える」場合があり、その場合にはグローバル変数の使用は不可避となる。
また、旧来のプログラムを組んでいたプログラマーがそのままJavaに移行しても、同様に疑似グローバル変数を使用する場合がある。
決して過去の遺物ではなく、いつ眼前に現れるか分からず、そして不可避の場合も多いため、覚悟はしておくこと。
スコープにも寿命にも束縛されず、プログラムのあらゆる箇所から自由にアクセスできる変数を「グローバル変数」と呼ぶ。
Javaでは、厳密な意味でのグローバル変数は存在しない。
Javaの変数は、メソッド内の「ローカル変数」か、クラスの内の「フィールド」しか存在しないためである。
ただし、擬似的なグローバル変数を作ることはできる。publicクラスのフィールドをpublicフィールドでかつstaticフィールドとすることで、あらゆる箇所からアクセスできる変数となる。ただしfinalフィールドの場合には「定数」となるため疑似グローバル変数とはならない。
疑似グローバル変数は決して使用してはならない。
変数は、アクセスできる範囲が広まれば広まるほど、プログラマーが気を付けなければならない範囲が広がる。範囲が広がれば広がるほど注意しきれなくなり、バグが生まれる確率が高くなる。
また、こうして作られたプログラムは、得てして「一人の人間の脳内におけるプログラムの管理」によってのみ変数の管理が行われている。「このフィールドはAクラスのb()メソッドでしかアクセスしてないし、それ以外のクラスからはアクセスさせない」といった注意がそのプログラマーの頭の中にしかない場合、完成しリリース後に別の人員がメンテナンスする場合に最悪の結果を迎える。
ローカル変数を使用し、フィールドもstatic finalフィールド以外は全てprivateフィールドとすることが望ましい。そうすることで使用される範囲を最小限にすることができるためである。
グローバル変数は、旧来のプログラムでは一般的であった。
その「旧来のプログラム」をJavaで作り直す(リプレースする)プロジェクトの場合、工費削減のため得てして「旧来のプログラムをそのままJavaに置き換える」場合があり、その場合にはグローバル変数の使用は不可避となる。
また、旧来のプログラムを組んでいたプログラマーがそのままJavaに移行しても、同様に疑似グローバル変数を使用する場合がある。
決して過去の遺物ではなく、いつ眼前に現れるか分からず、そして不可避の場合も多いため、覚悟はしておくこと。
参考サイト
- (参考サイトはありません)
// Sample.java
// Javaではグローバル変数は作れません。
// int i = 0;
// コンパイルエラー:
// キーワード "int" に構文エラーがあります。正しくは "interface", "class" です。
// 以下、悪例です。
// グローバル変数もどきは使用してはいけません。
// ある意味、publicクラスはグローバルですが、通常、グローバルとは
// 変数に当てはまります。
public class Sample
{
// publicフィールドでかつstaticフィールド。
// 厳密にはグローバルではありませんが、ほぼ同じような意味でしょう。
public static int data = 0;
public static void main( String[] args )
{
// ローカル変数。
// これが一番安全。
int i = 0;
// Javaでは厳密な意味でのグローバル変数は使用できませんが、
// publicクラスのpublicフィールドを同じように使用できます。
data = 100;
System.out.println( data );
// 100
// dataフィールドを使うUseDataクラスを使います。
UseData useData = new UseData();
useData.useData();
System.out.println( data );
// 101
// useData()メソッドにdataフィールドの値が変えられています。
// グローバル変数はありとあらゆるところからアクセスできるため、
// プログラムが10倍になれば100倍バグが生まれます。
// 絶対に使用しないようにしてください。
}
}
/**
* dataフィールドを使うクラス。
*/
class UseData
{
/**
* Sampleクラスのdataフィールドを使用するメソッド。
*/
public void useData()
{
// Sampleクラスのdataフィールドにアクセスします。
System.out.println( Sample.data );
// 100
++Sample.data;
System.out.println( Sample.data );
// 101
}
}
// Javaではグローバル変数は作れません。
// int i = 0;
// コンパイルエラー:
// キーワード "int" に構文エラーがあります。正しくは "interface", "class" です。
// 以下、悪例です。
// グローバル変数もどきは使用してはいけません。
// ある意味、publicクラスはグローバルですが、通常、グローバルとは
// 変数に当てはまります。
public class Sample
{
// publicフィールドでかつstaticフィールド。
// 厳密にはグローバルではありませんが、ほぼ同じような意味でしょう。
public static int data = 0;
public static void main( String[] args )
{
// ローカル変数。
// これが一番安全。
int i = 0;
// Javaでは厳密な意味でのグローバル変数は使用できませんが、
// publicクラスのpublicフィールドを同じように使用できます。
data = 100;
System.out.println( data );
// 100
// dataフィールドを使うUseDataクラスを使います。
UseData useData = new UseData();
useData.useData();
System.out.println( data );
// 101
// useData()メソッドにdataフィールドの値が変えられています。
// グローバル変数はありとあらゆるところからアクセスできるため、
// プログラムが10倍になれば100倍バグが生まれます。
// 絶対に使用しないようにしてください。
}
}
/**
* dataフィールドを使うクラス。
*/
class UseData
{
/**
* Sampleクラスのdataフィールドを使用するメソッド。
*/
public void useData()
{
// Sampleクラスのdataフィールドにアクセスします。
System.out.println( Sample.data );
// 100
++Sample.data;
System.out.println( Sample.data );
// 101
}
}
// Sample.java // Javaではグローバル変数は作れません。 // int i = 0; // コンパイルエラー: // キーワード "int" に構文エラーがあります。正しくは "interface", "class" です。 // 以下、悪例です。 // グローバル変数もどきは使用してはいけません。 // ある意味、publicクラスはグローバルですが、通常、グローバルとは // 変数に当てはまります。 public class Sample { // publicフィールドでかつstaticフィールド。 // 厳密にはグローバルではありませんが、ほぼ同じような意味でしょう。 public static int data = 0; public static void main( String[] args ) { // ローカル変数。 // これが一番安全。 int i = 0; // Javaでは厳密な意味でのグローバル変数は使用できませんが、 // publicクラスのpublicフィールドを同じように使用できます。 data = 100; System.out.println( data ); // 100 // dataフィールドを使うUseDataクラスを使います。 UseData useData = new UseData(); useData.useData(); System.out.println( data ); // 101 // useData()メソッドにdataフィールドの値が変えられています。 // グローバル変数はありとあらゆるところからアクセスできるため、 // プログラムが10倍になれば100倍バグが生まれます。 // 絶対に使用しないようにしてください。 } } /** * dataフィールドを使うクラス。 */ class UseData { /** * Sampleクラスのdataフィールドを使用するメソッド。 */ public void useData() { // Sampleクラスのdataフィールドにアクセスします。 System.out.println( Sample.data ); // 100 ++Sample.data; System.out.println( Sample.data ); // 101 } }