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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

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

Q&A

6回答

26194閲覧

staticなmethodのメリットとは

token_regain

総合スコア25

Java

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

2グッド

5クリップ

投稿2015/07/22 01:49

java初心者です。

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

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

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

k_mail, akaikesan👍を押しています

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

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

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

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

投稿2015/07/22 02:02

ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

token_regain

2015/07/22 02:06

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

2015/07/22 04:37

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

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

shiolier

総合スコア1156

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

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

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

投稿2015/07/22 05:37

NARH

総合スコア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

MakotoMiyazaki

総合スコア297

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

methodをstaticにするメリットとは何なのでしょうか。

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

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

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

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

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

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

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

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

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

投稿2015/07/22 02:50

LLman

総合スコア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

ko-hatanaka

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問