質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • Java

    13522questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

staticなmethodのメリットとは

受付中

回答 6

投稿

  • 評価
  • クリップ 2
  • VIEW 7,739

token_regain

score 16

java初心者です。

staticという言葉に混乱しています。
staticなフィールドを持つクラスを作成したときに
そのクラスから作成されたインスタンスが共通のクラスを持つ事で、
あるインスタンスのフィールドの変更が反映されたり、と
フィールドをstaticにするメリットは理解できました。

それに対してmethodをstaticにするメリットとは何なのでしょうか。
メリットというより使い道がよく理解できません。

フィールド含め、staticの使い方はまだまだ分からない事ばかりです。
何か足掛かりになるヒントをいただければと思います。
宜しくお願い致します。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

+7

例えば、
Mathクラスにsin(x)を実装するとします。
どう実装しますか?

Mathクラスの非staticメソッドとして実装すると
利用側はsinを求めるためにMathクラスのインスタンスを生成しなければなりません。
sinを求めるのになんの状態も必要ないので、インスタンスを作るだけ無駄です。

staticメソッドならインスタンス生成なしにMath.sin(x)といきなり書けます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/22 11:06

    なるほど。
    状態が必要なく、コンストラクタも必要ないようなクラスを作成するときに効果を発揮するという事ですね。
    同一クラス内にstaticなメソッドとstaticでないメソッドが混在する状況はあまり出てこないという訳でしょうか。

    キャンセル

  • 2015/07/22 13:37

    そうでもありません。
    Stringやプリミティブのラッパークラスにはstatic、非staticメソッドが混在しています。
    Stringを例に取ると、Stringオブジェクトの情報を使って何かする場合は非static、
    他の情報からStringを生成するメソッドがstaticになっています。
    前者は特定の位置の文字を取得するcharAt、部分文字列を取得するsubstringがあります。
    後者には様々な値やオブジェクトを受け取って文字列に変換するvalueOf等が該当します。
    後者は単に「文字列に変換する」だけなので、それ用にインスタンスを生成する必要はありません。文字列絡みのメソッドなのでStringクラスに属しているだけです。

    キャンセル

+4

staticを利用する代表的な例としてシングルトンがあります。
class SingletonClass {
    // staticフィールド
    private static SingletonClass instance = new SingletonClass();

    private SingletonClass(){
    }

    // staticメソッド
    public static SingletonClass getInstance() {
        return instance;
    }

    public void method() {
        // シングルトンで行いたい処理
    }
}

他にもファクトリメソッドなどがあります。
abstract class Parent {
    // ファクトリメソッド
    public static Parent create() {
        Parent parent = null;
        if (true) {  // 何かしらの条件
            parent = new Child1();
        } else {
            parent = new Child2();
        }
        return parent;
    }
}

class Child1 extends Parent {
    // 中略
}

class Child2 extends Parent {
    // 中略
}

他の使い方としては、ユーティリティな関数を定義したいという場合などに使えます。
とは言っても、Javaでは関数は使えません。処理だろうと何だろうと、クラスに含める必要があります。
class Utilities {
    public static int utilityMethod1(int param) {
        int result;
        // 処理
        return result;
    }
    public static int utilityMethod2(int param) {
        int result;
        // 処理
        return result;
    }
}
こうすることによってUtilities.utilityMethod1(10)などのように使うことができます。
もしUtilities.utilityMethod1がstaticでなかった場合、new Utilities().utilityMethod1(10)この様にインスタンス生成する必要が生じてしまいます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

簡単に言うと、「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
に昔考察を書いてみたことがあるので、よかったら読んでみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

methodをstaticにするメリットとは何なのでしょうか。 
すでに回答されているように、インスタンスの生成が必要ないことです。
そのため、数学関数(メソッド)を含むユーティリティクラスでよく使われます。

しかしこれだけだと、回答する意義が薄いので、少し別の角度から述べてみます。


staticの使い方はまだまだ分からない事ばかりです。 
何か足掛かりになるヒントをいただければと思います。 

インスタンスかスタティックか、と対比すると分かりやすいです。
その違いは個体に分化させて状態を持たせるかどうかの違いです。

同じ人間というクラスでも、太郎と花子のインスタンスは違います。
しかし、数学関数だとその必要はないので、スタティックにします。

英語の単数形と複数形の違いみたいなもので、
日本語で意識しない概念なので取っつきにくいでしょうが、
意識するようになれば自然とイメージできるようになります。


なお、「ユーティリティクラスは必要か」という議論があります。

不要側の意見としては、ユーティリティクラスが肥大化していくと
オブジェクト指向的でなくなりがちなため、不要だというのです。

私の立場としては、濫用は禁物だけど、必要最小限で使うなら良いと考えます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

static をインスタンスに絡めて覚えている方が多いようですが、私は、メモリ上に唯一つだけと理解しています。

なので、static なメソッドはオブジェクトの状態を意識しないメソッドやstatic な変数の状態を変える場合で利用します。

状態を意識しないものならば、インスタンスの数分、メモリ上に展開する必要はありませんからね。

ちなみに、staticな変数の変更の場合は、スレッドセーフにならないので、排他をしたり考慮する必要があります。

オブジェクトは、データと操作がセットになっているので、this で自身のデータを指します。static なものはオブジェクトのインスタンスとは異なるメモリ領域に格納されるため、this として自身を参照することはできません。


投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

staticメソッドの利点を一言で言うと、「インスタンスを作成する必要がない」だと思います。

使い方としては、いろいろあると思いますが、私はstatic変数に外部からデータを読み込む際によく利用します。

例えば、簡単なレジシステムを作成する場合、物と値段を以下の例のように外部ファイルに持つとします。
例)
みかん 100
りんご 200
ばなな 50

この場合に以下のように実装します。

class Price {
  static Map<String, int> price_table = null;
  private int total = 0;

  static void prepare() {
    /* 外部ファイルを読み込んでprice_tableに代入する */
  }

  int add(String item){
    /* 物の値段を取得 */
    int price = price_table.get(item);
    /* 合計を計算 */
    total = total + price;
    return total;
  }

}

上記、のように実装していれば、使う側は以下のように別の計算を行う際に同じデータを参照できます。

/* 準備 */
Price.prepare();

/* 一人目を計算 */
Price one = new Price();
int one_total = 0;
one_total = one.add("りんご");
one_total = one.add("みかん");

/* 二人目を計算 */
Price two = new Price();
int two_total = 0;
two_total = two.add("りんご");
two_total = two.add("みかん");

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13522questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。