java初心者です。
staticという言葉に混乱しています。
staticなフィールドを持つクラスを作成したときに
そのクラスから作成されたインスタンスが共通のクラスを持つ事で、
あるインスタンスのフィールドの変更が反映されたり、と
フィールドをstaticにするメリットは理解できました。
それに対してmethodをstaticにするメリットとは何なのでしょうか。
メリットというより使い道がよく理解できません。
フィールド含め、staticの使い方はまだまだ分からない事ばかりです。
何か足掛かりになるヒントをいただければと思います。
宜しくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
例えば、
Mathクラスにsin(x)を実装するとします。
どう実装しますか?
Mathクラスの非staticメソッドとして実装すると
利用側はsinを求めるためにMathクラスのインスタンスを生成しなければなりません。
sinを求めるのになんの状態も必要ないので、インスタンスを作るだけ無駄です。
staticメソッドならインスタンス生成なしにMath.sin(x)といきなり書けます。
投稿2015/07/22 02:02
総合スコア13551
0
staticを利用する代表的な例としてシングルトンがあります。
Java
1class SingletonClass { 2 // staticフィールド 3 private static SingletonClass instance = new SingletonClass(); 4 5 private SingletonClass(){ 6 } 7 8 // staticメソッド 9 public static SingletonClass getInstance() { 10 return instance; 11 } 12 13 public void method() { 14 // シングルトンで行いたい処理 15 } 16}
他にもファクトリメソッドなどがあります。
Java
1abstract class Parent { 2 // ファクトリメソッド 3 public static Parent create() { 4 Parent parent = null; 5 if (true) { // 何かしらの条件 6 parent = new Child1(); 7 } else { 8 parent = new Child2(); 9 } 10 return parent; 11 } 12} 13 14class Child1 extends Parent { 15 // 中略 16} 17 18class Child2 extends Parent { 19 // 中略 20}
他の使い方としては、ユーティリティな関数を定義したいという場合などに使えます。
とは言っても、Javaでは関数は使えません。処理だろうと何だろうと、クラスに含める必要があります。
Java
1class Utilities { 2 public static int utilityMethod1(int param) { 3 int result; 4 // 処理 5 return result; 6 } 7 public static int utilityMethod2(int param) { 8 int result; 9 // 処理 10 return result; 11 } 12}
こうすることによってUtilities.utilityMethod1(10)
などのように使うことができます。
もしUtilities.utilityMethod1
がstaticでなかった場合、new Utilities().utilityMethod1(10)
この様にインスタンス生成する必要が生じてしまいます。
投稿2015/07/22 02:22
総合スコア1156
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
static をインスタンスに絡めて覚えている方が多いようですが、私は、メモリ上に唯一つだけと理解しています。
なので、static なメソッドはオブジェクトの状態を意識しないメソッドやstatic な変数の状態を変える場合で利用します。
状態を意識しないものならば、インスタンスの数分、メモリ上に展開する必要はありませんからね。
ちなみに、staticな変数の変更の場合は、スレッドセーフにならないので、排他をしたり考慮する必要があります。
オブジェクトは、データと操作がセットになっているので、this で自身のデータを指します。static なものはオブジェクトのインスタンスとは異なるメモリ領域に格納されるため、this として自身を参照することはできません。
投稿2015/07/22 05:37
総合スコア209
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
簡単に言うと、「staticなメソッドはインスタンス化しなくても利用できる」というのが
一番のメリットです。
インスタンス化しなくても利用できる、ということは
クラスとしての定義が決まった時点で用途が確定し
実体化しなくても、その用途に影響を及ぼさない
ということです。
なので、MathやStringUtilsのようなUtilityクラスでよく利用されます。
これらのUtilityクラスのメソッド達は、メソッド単体で処理が完結し
インスタンスの状態によって処理が影響を受けない為、staticで定義されています。
混在する状況が出てこないか?ということであれば、クラスの責務による、としか言えません。
例えば、java.io.Fileクラスでは、Fileに関連する処理を責務として持っているため
コンストラクタで、どのファイルを処理するのか?という情報を受け取っています。
コンストラクタで受け取ったファイルに関する処理はすべてstaticではありませんが(existsやcreateNewFile等)
ファイル全体に関する処理はstaticです。(ファイルシステムの配下ファイルを取得するlistRoots等)
個人的には、staticメソッドはオブジェクト指向をきっちり理解せずに使うと、クラス設計が
大きく崩れる可能性があるので、極力利用しないようにしたほうがいいと考えています。
その辺は
http://makotojun.blog52.fc2.com/blog-entry-35.html
に昔考察を書いてみたことがあるので、よかったら読んでみてください。
投稿2015/07/22 02:26
総合スコア297
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
methodをstaticにするメリットとは何なのでしょうか。
すでに回答されているように、インスタンスの生成が必要ないことです。
そのため、数学関数(メソッド)を含むユーティリティクラスでよく使われます。
しかしこれだけだと、回答する意義が薄いので、少し別の角度から述べてみます。
staticの使い方はまだまだ分からない事ばかりです。
何か足掛かりになるヒントをいただければと思います。
インスタンスかスタティックか、と対比すると分かりやすいです。
その違いは個体に分化させて状態を持たせるかどうかの違いです。
同じ人間というクラスでも、太郎と花子のインスタンスは違います。
しかし、数学関数だとその必要はないので、スタティックにします。
英語の単数形と複数形の違いみたいなもので、
日本語で意識しない概念なので取っつきにくいでしょうが、
意識するようになれば自然とイメージできるようになります。
なお、「ユーティリティクラスは必要か」という議論があります。
不要側の意見としては、ユーティリティクラスが肥大化していくと
オブジェクト指向的でなくなりがちなため、不要だというのです。
私の立場としては、濫用は禁物だけど、必要最小限で使うなら良いと考えます。
投稿2015/07/22 02:50
総合スコア5592
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
staticメソッドの利点を一言で言うと、「インスタンスを作成する必要がない」だと思います。
使い方としては、いろいろあると思いますが、私はstatic変数に外部からデータを読み込む際によく利用します。
例えば、簡単なレジシステムを作成する場合、物と値段を以下の例のように外部ファイルに持つとします。
例)
みかん 100
りんご 200
ばなな 50
この場合に以下のように実装します。
java
1class Price { 2 static Map<String, int> price_table = null; 3 private int total = 0; 4 5 static void prepare() { 6 /* 外部ファイルを読み込んでprice_tableに代入する */ 7 } 8 9 int add(String item){ 10 /* 物の値段を取得 */ 11 int price = price_table.get(item); 12 /* 合計を計算 */ 13 total = total + price; 14 return total; 15 } 16 17}
上記、のように実装していれば、使う側は以下のように別の計算を行う際に同じデータを参照できます。
java
1 2/* 準備 */ 3Price.prepare(); 4 5/* 一人目を計算 */ 6Price one = new Price(); 7int one_total = 0; 8one_total = one.add("りんご"); 9one_total = one.add("みかん"); 10 11/* 二人目を計算 */ 12Price two = new Price(); 13int two_total = 0; 14two_total = two.add("りんご"); 15two_total = two.add("みかん"); 16
投稿2015/07/22 02:22
総合スコア45
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/22 02:06
2015/07/22 04:37