2015年11月22日日曜日

Javaでグローバル変数っぽいものを使う方法

グローバル変数というのは昔、オブジェクト指向型プログラミングが開発される前に広く用いられていたもので、ふつうJava(オブジェクト指向型の言語)では使われないようです。ただし、もしそういうグローバル変数っぽいものを使いたいのであればつぎのように使うことができます。

まずはオブジェクトを作って、そのメンバ変数を呼び出す方法。メインメソッドの外で宣言された変数aをMathSampleクラスのtestメソッドを適用し、その結果を再度変数aに代入しています。ただし、変数aをそのままグローバルに扱えるわけじゃありません。

public class Rensyu1 {
   int a;

   public static void main(String[] args) {
      MathSample plus = new MathSample(); //plusオブジェクトを作成
      Rensyu1 ren = new Rensyu1(); // renオブジェクトを作成
      ren.a = 30; //メンバ変数に代入
      ren.a = plus.test(ren.a); //plusオブジェクトからtestメソッドの呼び出し、変数aへ再度代入
      System.out.println(ren.a); //renオブジェクトの変数aには上で代入した値が入っている。
   }
}

   class MathSample {
      int test(int i) {
      return i+30;
      }
}

次に、より本来のグローバル変数の取り扱いに近い方法です。staticとpublicという修飾子を使います。「Static変数・Statcメソッドとはなにか」も参照してください。

public class Rensyu1 {
   public static int a;//public+staticを加えることでグローバル変数っぽい感じになりました。

   public static void main(String[] args) {
   MathSample plus = new MathSample();
   Rensyu1.a = 30;//staticフィールドにアクセスし値を入れる
   plus.test();//メソッド呼び出し
   System.out.println(Rensyu1.a);//表示する
   }
}

class MathSample {
   void test() {
   Rensyu1.a += 30;//外部クラスからも変数aに値を入れることができます。
   }
}

class OtherClass {
   void test() {
   Rensyu1.a += 30;//もちろんさらに違う外部クラスからも変数aに値を入れることができます
   // staticな変数なのでインスタンスを作ることなく直接変数をいじることができます。
   System.out.println(Rensyu1.a); //今変数aに入っている値を表示させることもできます。
   }
}

ただしpublicなグローバル変数は色々なオブジェクトから呼び出され値を上書かれるので、グローバル変数を使うと処理が追いづらくなります。(なので普通は変数ではなくグローバルな定数として使うか、修飾子で内部からしか参照できないようにするかなどの工夫が必要です。詳しくは知恵袋の回答を参照。)

参考文献
Yahoo知恵袋 maria_salon1984さんの回答  2008/6/2716:21:05