
初めまして。
c言語からjavaの勉強を始めたものです。
javaには共通ライブラリをstaticなメソッド(この言い方に慣れない)で作ることが多いようですが、なぜですか?
私の認識は、
staticはメモリの共有領域に確保され誰からも参照できる。
よって、メモリの効率的な確保が出来る。
でも、メソッドを共有領域に持つと各ユーザからそのメソッドが呼ばれたときに同じメモリをさすメソッドが使用される。
つまり、違うユーザがパラメタ違いで同じメソッドを使用すると、処理の途中でパラメタが書き換わってしまう可能性があるかと思います。
これって問題ないのでしょうか?
Sumple
public static boolean check(String str){
if(str==null){
return false;
}
int num = Integer.parseInt(str);
if(num < 0){
retrun true;
} else {
retrun false;
}
}
こんなメソッドがあり、パラメタが「2」の人と「-10」の人が同時にアクセスすると結果が変わりそうな気がします。
よろしくお願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
> javaには共通ライブラリをstaticなメソッド(この言い方に慣れない)で作ることが
> 多いようですが、なぜですか?
通常、クラスのメソッドを使用するにはそのクラスの
インスタンスを生成しなければなりません。
しかし、共通ライブラリのように使用頻度の高いメソッドの場合、
そのつどインスタンスを生成していては効率が悪いのため
staticメソッドにすることが多いようです。
No.2
- 回答日時:
> こんなメソッドがあり、パラメタが「2」の人と「-10」の人が同時にアクセスすると結果が変わりそうな気がします
理由の前に答えを言いますが、そんなことはありません。
> staticはメモリの共有領域に確保され誰からも参照できる。
staticにするとひとつのメモリを共有するというのは、フィールドの話です。
例えば、次の例では、SetとPow5の二つのメソッドに同時にアクセスするとうまくいかなくなります。
class Sample {
static int value;
public static void Set(int v) {
value = v;
}
public static int Pow5() {
return value * value * value * value * value;
}
}
Pow5メソッドが掛け算を行っている間に、Setメソッドがvalueの値を変えてしまうと、うまくいきません。
例えば計算の途中でvalueが2から5に変わると、Pow5が返す計算結果は
2 * 2 * 5 * 5 * 5
のようになってしまいます。
(もちろん、このようなことが起こらないようにするための対策法もJavaには用意されています。)
しかし、メソッドは話は別です。たとえメソッドがstaticであったとしても、ローカル変数までもがstaticになってしまうことはありません。
つまり、複数のスレッドが同時に同じstaticメソッドを呼び出したとしても、ローカル変数はそれぞれのスレッドで別々に用意されるのです。(C言語で言う所の「動的変数」です。Javaには、Cで言う「静的変数」はありません。)
フィールドやメソッドをstaticにするということは、それらをクラスのインスタンスと関連付けないということです。(C言語で使うstaticとはちょっと意味合いが違います。)
メソッドをstaticにする理由も、まさにここにあります。そのメソッドがインスタンスとつながりを持つかどうかによってstaticにするかどうかを決めるのです。
余談ですが、
if(num < 0){
retrun true;
} else {
retrun false;
}
と5行使って書くよりも1行で
return num < 0;
と書いたほうがビシッとしていてスマートですよ。
No.1
- 回答日時:
>こんなメソッドがあり、パラメタが「2」の人と「-10」の人が同時にアクセスすると結果が変わりそうな気がします。
そういうことはありません。
メソッド内で宣言された変数は、
そのメソッドを実行するときだけの変数です。
問題になるのは以下のような場合です。
class A{
static int value;
public int changeValue(x){
int tmp = value;
value = x;
return tmp;
}
}
つまり、staticメソッド自体は問題ないのですが、
static変数をメソッド内であれやこれやする処理で、
複数のスレッドを使うと結果が変になる場合があります。
そのため、複数のスレッドから使われるメソッドはsynchronizedをつけます。
共通ライブラリをstaticで作る理由は…、
たとえば、java.lang.Integerにいくつかstaticメソッドがありますが、
これらは論理的には、Integerクラスの中になくてもいいものです。
しかし、「関係あるメソッドだから、入れてしまえ」
ということで、Integerクラスに入っています。
本来、Javaではstaticメソッドはあまり推奨されるものではありません。
staticメソッドは、オブジェクト指向の作法から言うと、
やや問題があるものだからです。
(このへんのことを話すとものすごく長くなるので、略します)
staticメソッドが多すぎるようだったら、
あまりオブジェクト指向的でないライブラリかもしれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Visual Basic(VBA) シート削除のマクロで「deleteメソッドは失敗しました」となります。助けてください! Sub 不要 6 2022/09/08 16:41
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- その他(プログラミング・Web制作) pythonリストの特定の値を表示htmlで表示できない 2 2022/05/14 05:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
配列のメソッド
-
Labelコントロールに数字を代入...
-
mainメソッドのthrows節で設定...
-
final修飾子を使っているのに、...
-
FEM解析の読み方は?
-
CALLされていないメソッドを見...
-
C# 演算 最大値 最小値 表現の仕方
-
Refreshメソッドの使い方
-
c#でVBのcall的役割を果たすコ...
-
JSPで<SELECT>の中にDBから持っ...
-
Strutsで「setterメソッドが見...
-
コマンドプロンプト実行後に画...
-
エクセルのマクロでプリンタを...
-
処理内容がほぼ同じメソッドの...
-
DBを扱う上でのclose()メソッド...
-
エクセルVBAにおけるON TIMEメ...
-
javaの中でaddElementは何ですか?
-
VB.NET2017 の IntelliSense に...
-
ByteArrayInputStreamを配列に
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
【sendkeysメソッドが動かずに...
-
mainメソッドのthrows節で設定...
-
VBA コピーが出来ません…!
-
DataGridViewでセルクリックイ...
-
コマンドプロンプト実行後に画...
-
0歳児の指しゃぶりに関して
-
エクセルVBAにおけるON TIMEメ...
-
javascriptからjavaを呼び出したい
-
配列のメソッド
-
CALLされていないメソッドを見...
-
final修飾子を使っているのに、...
-
Labelコントロールに数字を代入...
-
VBPをダブルクリックするとたま...
-
ウィンドウを最前面にできません
-
処理内容がほぼ同じメソッドの...
-
Application.Wait の参照設定
-
C#.net Define文
-
C# 演算 最大値 最小値 表現の仕方
-
Excel VBA でExcelを終了したい...
おすすめ情報