
JavaServletが同時実行された(同一クラスのインスタンスが複数生成された?)時に、どうも不具合が起きているようで、その解決策を検討しています。
その中で、JAVAのスコープについて再度勉強し直していたのですが、以下の記述がいまいち理解できなかったので、教えて下さい。
<アクセス修飾子private>
同じクラス内からしか呼び出せないが、同じクラスから作られたオブジェクト同士であれば、相互の private メンバーにアクセスできる。
出典:http://msugai.fc2web.com/java/permitmod.html
「同じクラス内からしか呼び出せない」は分かります。ですが、「同じクラスから作られたオブジェクト同士であれば、相互の private メンバーにアクセスできる」というのが、具体的に想像できないのです。これは、同じクラスから生成されたインスタンスが複数存在する場合に、別のインスタンスのクラス変数の値を参照してしまう場合がありうるということでしょうか?
ちなみに、改修を検討しているクラスは、クラス変数をprivate、メインとなるメソッドAはprotected、メソッドAから呼び出されるメソッドBがpublicで定義されています。クラス変数はメソッドA・B両方から参照されています。
少なくともメソッドBはprivateに変更しなくてはいけないな、とは考えています。
No.3ベストアンサー
- 回答日時:
サーブレットにメンバ変数?
サーブレットは、ひとつのインスタンスで複数のブラウザからの
要求を同時に処理するので、メンバ変数は使わないのが定石。
使いたい場合はスレッドセーフにするために、細心の注意を払って
スレッド同期を行うか、処理毎にサービスクラスのインスタンス
を生成するようにします。
大丈夫ですか?
回答ありがとうございます。
>サーブレットは、ひとつのインスタンスで複数のブラウザからの
>要求を同時に処理するので、メンバ変数は使わないのが定石。
そうなんですね!基本を忘れていました。多分、作った人も、あんまり詳しくない人だったんだと思います。
メンバ変数の定義をメソッド内に移動し、必要があれば、メソッド間は引数で受け渡しするように修正します。
ありがとうございました。
No.2
- 回答日時:
もちろん「2」と表示されるんですが, それで「問題はない」とするなら何が問題なのでしょうか? いちおう
「同じクラスから生成されたインスタンスが複数存在する」場合に「別のインスタンスのメンバ変数の値を参照」している
例のつもりとして書いたんですけど....
ああいう場合でないとするならどういう状況なのか, 簡単な例で書いてもらえませんか?
返信が遅くなり申し訳ありませんでした。
返答を考えている間に、別作業が入ってきてしまって。
tknakamuriさんからご指摘頂きましたが、そもそもサーブレットのインスタンスは1つなんですね。
もう一度基礎を復習し直してから改修作業に入りたいと思います。
No.1
- 回答日時:
あるクラスにおいて 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;
}
とか.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数名の付け方
-
複数の変数を宣言する時、同時...
-
private static という変数の修飾
-
javaのクラスの作り方、エラー...
-
変数の参照でエラーが出てしま...
-
オブジェクト参照がオブジェク...
-
インスタンス参照でアクセスで...
-
「インスタンス」の意味をわか...
-
VB6.0で、DLLを動的に参照したい
-
フォームの存在をチェックする方法
-
C# インスタンスの破棄
-
Eclipse3でVisualEditorが起動...
-
VB.NET getとsetの概念がわかり...
-
インスタンスを同じ名前で作成...
-
privateスコープについて
-
Delphiでインスタンスが作成さ...
-
JSPでの表示
-
VB.NET Newしたものを変数に代...
-
C#において、同じインスタンス...
-
String a = "a"; と String b =...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
private static という変数の修飾
-
変数名の付け方
-
複数の変数を宣言する時、同時...
-
インスタンス参照でアクセスで...
-
生成したインスタンスを削除す...
-
オブジェクト参照がオブジェク...
-
C#において、同じインスタンス...
-
C# インスタンスの破棄
-
変数の参照でエラーが出てしま...
-
インスタンスを同じ名前で作成...
-
VB.NET getとsetの概念がわかり...
-
newしないインスタンス?実体化...
-
javaのクラスの作り方、エラー...
-
非staticフィールドを参照でき...
-
「インスタンス」の意味をわか...
-
[Visual C#] 優先される処理に...
-
フォームの存在をチェックする方法
-
大量のデータとインスタンスの...
-
C#「オブジェクト参照が必要で...
-
String a = "a"; と String b =...
おすすめ情報
文中の「クラス変数」はメンバ変数の間違いでした。(static無し)
メインとなるメソッドAはserviceメソッドです。
staticは、当該クラス内では一切使用されていません。
JAVAを扱うのは久しぶりなもので、失礼致しました・・・