アプリ版:「スタンプのみでお礼する」機能のリリースについて

初めまして。
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件)

> javaには共通ライブラリをstaticなメソッド(この言い方に慣れない)で作ることが


> 多いようですが、なぜですか?

通常、クラスのメソッドを使用するにはそのクラスの
インスタンスを生成しなければなりません。
しかし、共通ライブラリのように使用頻度の高いメソッドの場合、
そのつどインスタンスを生成していては効率が悪いのため
staticメソッドにすることが多いようです。
    • good
    • 4

> こんなメソッドがあり、パラメタが「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;

と書いたほうがビシッとしていてスマートですよ。
    • good
    • 6

>こんなメソッドがあり、パラメタが「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メソッドが多すぎるようだったら、
あまりオブジェクト指向的でないライブラリかもしれません。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!