dポイントプレゼントキャンペーン実施中!

JavaServletが同時実行された(同一クラスのインスタンスが複数生成された?)時に、どうも不具合が起きているようで、その解決策を検討しています。
その中で、JAVAのスコープについて再度勉強し直していたのですが、以下の記述がいまいち理解できなかったので、教えて下さい。

<アクセス修飾子private>
同じクラス内からしか呼び出せないが、同じクラスから作られたオブジェクト同士であれば、相互の private メンバーにアクセスできる。
出典:http://msugai.fc2web.com/java/permitmod.html

「同じクラス内からしか呼び出せない」は分かります。ですが、「同じクラスから作られたオブジェクト同士であれば、相互の private メンバーにアクセスできる」というのが、具体的に想像できないのです。これは、同じクラスから生成されたインスタンスが複数存在する場合に、別のインスタンスのクラス変数の値を参照してしまう場合がありうるということでしょうか?

ちなみに、改修を検討しているクラスは、クラス変数をprivate、メインとなるメソッドAはprotected、メソッドAから呼び出されるメソッドBがpublicで定義されています。クラス変数はメソッドA・B両方から参照されています。
少なくともメソッドBはprivateに変更しなくてはいけないな、とは考えています。

質問者からの補足コメント

  • へこむわー

    文中の「クラス変数」はメンバ変数の間違いでした。(static無し)
    メインとなるメソッドAはserviceメソッドです。
    staticは、当該クラス内では一切使用されていません。

    JAVAを扱うのは久しぶりなもので、失礼致しました・・・

      補足日時:2017/01/11 13:22

A 回答 (3件)

サーブレットにメンバ変数?



サーブレットは、ひとつのインスタンスで複数のブラウザからの
要求を同時に処理するので、メンバ変数は使わないのが定石。

使いたい場合はスレッドセーフにするために、細心の注意を払って
スレッド同期を行うか、処理毎にサービスクラスのインスタンス
を生成するようにします。

大丈夫ですか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>サーブレットは、ひとつのインスタンスで複数のブラウザからの
>要求を同時に処理するので、メンバ変数は使わないのが定石。

そうなんですね!基本を忘れていました。多分、作った人も、あんまり詳しくない人だったんだと思います。
メンバ変数の定義をメソッド内に移動し、必要があれば、メソッド間は引数で受け渡しするように修正します。
ありがとうございました。

お礼日時:2017/01/13 09:05

もちろん「2」と表示されるんですが, それで「問題はない」とするなら何が問題なのでしょうか? いちおう


「同じクラスから生成されたインスタンスが複数存在する」場合に「別のインスタンスのメンバ変数の値を参照」している
例のつもりとして書いたんですけど....

ああいう場合でないとするならどういう状況なのか, 簡単な例で書いてもらえませんか?
    • good
    • 0
この回答へのお礼

返信が遅くなり申し訳ありませんでした。
返答を考えている間に、別作業が入ってきてしまって。

tknakamuriさんからご指摘頂きましたが、そもそもサーブレットのインスタンスは1つなんですね。
もう一度基礎を復習し直してから改修作業に入りたいと思います。

お礼日時:2017/01/13 09:09

あるクラスにおいて private なメンバーは, その同じクラスのメソッドから自由にアクセスすることができます. だから「同じクラスから生成されたインスタンスが複数存在する場合に、別のインスタンスのクラス変数の値を参照してしまう」こともできますし, あるいは「クラスメソッドから private なインスタンスメソッドを呼び出す」ことも可能です.



例えば

public class A {
public static void main(String[] args) {
A a = new A(1), b = new A(2);
a.print(b);
}
public A(int x) { this.x = x; }
private void print(A t) { System.out.println(t.x); }
private int x;
}

とか.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
この場合、出力結果は2にはならないんでしょうか?2なら問題はないような気がするのですが。

お礼日時:2017/01/11 13:03

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