• ベストアンサー

変数とフィールドの使い分け

Javaを勉強し始めて半年くらいの者です。最近、プログラムを作成する際に変数とフィールドの使い分けがあいまいになってきました。フィールドとして定義すれば、そのクラス全体で使う事が出来ますよね?しかし、これは変数として最初に適用範囲が全体になるように(要はメソッドの中とかではないところに)定義すればそのクラス全体で使う事が出来ますよね?そうすると、何を変数にして、何をフィールドにすれば良いかがこんがらがってしまうのです。極端な話。。そのクラスで使う変数を全てフィールドで定義してしまえば、変数なんていらないのではないでしょうか?逆に、フィールドをなくして、全て変数で定義することもできるのではないか等と考えてしまうのです。この2つの明確な違いはなんなのでしょうか?みなさんはどういう風に使い分けていますか?

noname#9262
noname#9262
  • Java
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • akira-h
  • ベストアンサー率80% (4/5)
回答No.1

私が使い分けているのは、データを残すか残さないかでフィールドにするか、変数にするかを使い分けています。 オブジェクトがメモリ上に残っている間はそのフィールドの値もメモリ上に残ります。変数はメソッドが呼ばれている間は残りますが、メソッドが終了するとクリアされます。 メモリの管理は自分たちが気にすることなくJavaの特徴でもあるガーベジコレクション機能により管理されていますよね。 もし仮にフィールドだけを使っていたら、ガーベジコレクションが大忙しになり、システム全体が重くなってしまいますよね。 と言う事から、私はちゃんと用途を考えてフィールド、変数を使い分けています。 (※メソッドが終了すると変数がクリアされるはちょっと自信がありませんが…)

noname#9262
質問者

お礼

回答ありがとうございました。なるほど。。なにか実用的なプログラムを作る時にはメモリなどのことも考えなくてはいけないのですね。。参考になりました。

その他の回答 (1)

  • sasadora
  • ベストアンサー率68% (59/86)
回答No.2

そのクラス自体がもつべき属性を、フィールドとするべきだと思います。 クラスで使う変数をすべてフィールドで用意してしまったら、 メソッド内で、その変数を使用するときに、いつ値がセットされたか、 はたまたセットされていないのか、さっぱり分からなくなってしまいます。 そのクラスが持つべき属性(インスタンスが存在する間ずっと保持している値)→フィールド そうではない一時的なもの→ローカル変数

noname#9262
質問者

お礼

回答ありがとうございました。意外にこの辺は明確な定義がないのですねぇ。まぁ。そうだからこそ、みなさんの様に自分なりの使い分け方を持っているか、持っていないかで、プログラムが読みやすくなったり、またその逆もあるのかもしれません。

関連するQ&A

  • フィールド、インスタンス変数、プロパティ、…

    フィールド、インスタンス変数、プロパティ、… C++では、クラスの構成要素はメンバと呼ばれ、メンバには変数と関数と二種類あり、変数は、 (1)メンバ変数(オブジェクトがデータを保持するメンバである事を強調する為、別称データメンバ) 関数は、 (2)メンバ関数 と、とってもクリアに呼ばれていました。 ところがJavaになって、メンバ変数が (1’)フィールド メンバ関数が (2’)メソッド と呼ばれるようになりました。 さらに(1’)が、 (1’’)インスタンス変数 (1’’’)プロパティ という風にも呼ばれるようになり、(1')と(1'')と(1''')が、混同して呼ばれるようになりました。 多くの人は、 「それらは "interchangeable" で同じ意味で用いられるものなのだ」 という根拠がよくわからない『解説』をしますが、同じ意味ならば同じ用語を使った方が全体がスッキリ且つ正確に表現できて都合がいいのに、なんでいろいろな用語を混用するのでしょうか? (A)そもそも何でデータメンバをフィールドと言い換えたのか?  (a)データメンバの方が、それがデータであることを示唆していていいのでは?  (b)フィールドって、Cの構造体のフィールドから名前が由来しているのでしょうか? (A)何でわざわざ(1'')や(1''')みたいな用語を使うのか? (B)どういう意図でそういう用語を使うのか? そこら辺の事情に詳しい方がいらっしゃいましたら、お教えください。

    • ベストアンサー
    • Java
  • ローカル変数の使いかた

    非常に初歩的なのですがrubyにおいてインスタンス変数、ローカル変数とクラス変数の使い分けがわかりません。 あるクラス内においてクラスから作られたすべてのオブジェクトに適用したい値はクラス変数に、インスタンスごとに違うのならインスタンス変数にするのはわかるのですが、クラス内でローカル変数はなぜ使うのでしょうか?受け取った引数もオブジェクトならインスタンス変数に、クラスならクラス変数に原理的には属すと思うのです。 あるオブジェクトがあるメゾッドを実行した時にそのオブジェクト全体に適用したくない変数をローカル変数にすると考えました。 その場合、なぜ class A a= 1 end のようにメゾッドに属さないクラス内にあるローカル変数があるのでしょうか?

  • インスタンス変数とクラス変数の違い

    1つのクラスオブジェクト内のインスタンス全てで共有できる クラス変数 @@a と、 同じインスタンス内であればメソッドの定義を越えてその値を 参照したり、変更したりできるインスタンス変数 @a のスコープの違いをお手すきでしたらご指導願えませんか? あとクラス変数にはセッターやゲッター等のアクセスメソッドを 設定できるんですか? いろいろ知りたいです。

    • ベストアンサー
    • Ruby
  • java オペランド、フィールド

    Javaにおいて オペランド フィールド メソッドという言葉があると思いますが これらは上から順に他の言語でいう 変数 変数宣言 関数 という事で合っていますか? 合っていても合っていなくても また何故オペランドやフィールドという言葉を使うのでしょうか?他の言語と差別化を図る為ですか?

    • ベストアンサー
    • Java
  • Calendarクラスのフィールドは、クラス変数?インスタンス変数?どちらですか?

    宜しくお願いします。 Calendarクラスのフィールドの、Calendar.YEARなどは、 Calendarというクラス名で修飾されているので「クラス変数」ですよね。 クラス変数なので、全てのインスタンスで共有されているはずです。 なので、あるインスタンスから、Calendar.YEARに変更を加えると、全てのインスタンスに 変更が適用されると思うのですが、そうなりません。何故でしょうか。 例えば以下のようなコードを書いた場合、このように出力されます。 2008年10月6日 2009年10月6日 2008年10月6日 YEARはクラス変数なので、3つ目の出力も2009年になると思ったのですが、YEARは 各インスタンスで所有されているようです。 (上手くインデントできないようでして、読みにくいコードで失礼します) import java.util.*; public class DateTest { public static void main(String[]args){ Calendar cal = Calendar.getInstance(); showDate(cal); Calendar cal2 = Calendar.getInstance(); cal2.add(Calendar.YEAR, 1);//ここでCalendarのクラス変数を変更している showDate(cal2);//変更が適用されている showDate(cal);//変更が適用されていない?なぜ? }  //Calendarインスタンスの年・月・日を出力する public static void showDate(Calendar cal){ System.out.println(cal.get(Calendar.YEAR)+"年"              +(cal.get(Calendar.MONTH)+1)+"月" +cal.get(Calendar.DATE)+"日"); } } プログラムは嘘をつかないので、自分の理解が誤っていると思います。 どなたか解決する知識をお持ちの方、どうぞご教示ください。 (初心者ですので、できれば、ほどほどのレベルの説明でお願いします。) 宜しくお願いします。

  • 科目を扱うためのフィールドからなるクラス

    以下のように作成するクラスsubjectのjavaプログラムがわからないので教えてください。 1.フィールド名はenglish,literature,mathematicsとし、型はすべてintとする。アクセス修飾子はどこからでも参照できるようにする(インスタンス変数) 2.コンストラクタはデフォルトのコンストラクタと1.のフィールドに値を設定するためのコンストラクタの2つを用意する。

  • 用語の意味の違いを教えてください。

    JAVAを勉強してまして、同じような意味であろう用語がたくさん出てきて頭が混乱してしまいました。 ・クラス変数 ・メンバ変数 ・インスタンス変数 ・プロパティ ・フィールド ・アトリビュート これらの用語の意味の違い、使い分けを教えていただけないでしょうか? 個人的な解釈: ・変数の総称? ・メソッドは含まない? ・定数は含まない?

    • ベストアンサー
    • Java
  • interface,extend,implementのちがい

    お世話になります、 Javaを勉強しているのですが、 interface,extend,implementの使い分けがわかりません。 私の解釈としては、 (1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。 (2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。 (3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか? とにかくこの3つのを使い分けるコツとかあれば教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • クラス変数/メソッドとインスタンス変数/メソッドの見え方について

    Javaの言語仕様(?)についてお教え下さい。 参照変数の型がインスタンスのスーパークラスの型の時、クラス変数/メソッドとインスタンス変数/メソッドの見え方が納得いかずに困っています。 以下のような条件の時です。   ・クラスが2つあり、1つはもう1つのクラスを継承しています。     それぞれを「スーパー」「サブ」と以下で呼びます。   ・インスタンスは"サブ"の型です。   ・上記インスタンスへの参照変数は"スーパー"のクラスの型です。   ・"スーパー"、"サブ"ともに【同名】の「クラス」変数/メソッド、「インスタンス」変数/メソッドがあります。 この場合に、"サブ"のインスタンスを参照している"スーパー"の型の変数を介し、それらにアクセスしたらどれが見えるか?という疑問です。 実験結果では以下のようになりました。           [フィールド]  [メソッド]   [1.static ]  スーパーの   スーパーの   [2.非static]  スーパーの   サブの 納得いかないのは「2.非static」で「フィールド」が、「スーパーの」になるところです。 これも「サブの」になると思っていました。 なぜサブクラスのが見えないのでしょうか? 同名の変数なのでスーパークラスのはサブクラスので隠れされ、サブクラスのが見えると思っていたのですが。 参考書には以下のように書いてありました。   フィールドの場合、参照変数の型のものが見える。   メソッドの場合、インスタンスの型のものが見える。 私には不自然に感じられるのですが、「こういう仕様だから。」と納得するしか無いのでしょうか? 「なぜこうなるか」について説明がある文献、サイトなどありましたらお教えください。 参考までに以下が実験したサンプルコードと結果です。長くて申し訳ありません。 「サンプルコード」 public class Super { static int staticField = 10; int instanceField = 100; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class Sub extends Super { static int staticField = 90; int instanceField = 900; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class TestStatic { public static void main(String[] args) { // インスタンスはSub、参照変数もSub、という状態。 Sub sub = new Sub(); System.out.println( "実験1" ); System.out.println( "1.クラス変数      " + sub.staticField ); System.out.print( "2.クラスメソッド    " ); sub.staticMethod(); System.out.println( "3.インスタンス変数   " + sub.instanceField ); System.out.print( "4.インスタンスメソッド " ); sub.instanceMethod(); // インスタンスはSub、参照変数はSuper、という状態。 Super sup = new Sub(); System.out.println( "実験2" ); System.out.println( "5.クラス変数      " + sup.staticField ); System.out.print( "6.クラスメソッド    " ); sup.staticMethod(); System.out.println( "7.インスタンス変数   " + sup.instanceField ); System.out.print( "8.インスタンスメソッド " ); sup.instanceMethod(); } } 「結果」 実験1 1.クラス変数      90 2.クラスメソッド    staticField = 90 3.インスタンス変数   900 4.インスタンスメソッド instanceField = 900 実験2 5.クラス変数      10 6.クラスメソッド    staticField = 10 7.インスタンス変数   100 8.インスタンスメソッド instanceField = 900 納得が行かないのは7のところです。 以上よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 【Java】変数?定数?

    ↓のようなjavaのクラスの中で各メソッド毎にMETHODという名の文字列をfinalで定義した場合なのですが、METHODは変数ですか?定数ですか? public class test { public void test1 () { final String METHOD="test1"; system.out.println("メソッド名=" + METHOD); } public void test2 () { final String METHOD="test2"; system.out.println("メソッド名=" + METHOD); } }

    • ベストアンサー
    • Java