1

たとえば、次のようなクラスがあります。

public class StaticObjectReference{
     private static StaticObjectReference instance;
     private Vector queue;

     public static StaticObjectReference getInstance(){
         if(instance == null){
              instance = new StaticObjectReference();
         }

         return instance;
     }

     public Vector getQueue(){
         queue = new Vector();
         return queue;
     }
}

そして、これらの次の 2 つのクラスはクラスと呼ばれStaticObjectReferenceます。

public class CallerOne{
    Vector queue1;

    public void callObjectInstance1(){
         queue1 = StaticObjectReference.getInstance().getQueue();
    }
}

class CallerTwo{
    Vector queue2;

    public void callObjectInstance2(){
         queue2 = StaticObjectReference.getInstance().getQueue();
    }
}

クラス CallerOneのqueue1は、クラス CallerTwo の同じインスタンスqueue2ですか?

4

2 に答える 2

2

クラスの同じインスタンスを使用しStaticObjectReferenceてキューにアクセスしているので、はい、それらは同じキューです。

ただし、これは静的であるという事実とは 直接関係がないことに注意してください。このクラスがシングルトンパターンを実装していることにはさらに多くのことが必要であるため、クラスのインスタンスは1つだけです。instance

ブライアンが指摘するように、この実装はスレッドセーフではありません。スレッドセーフな方法については、ウィキペディアのリンクを確認してください。

于 2013-01-10T02:39:29.240 に答える
2

オブジェクト参照が静的である場合、そのオブジェクトの属性も静的であることを意味しますか?

この質問は、文字通り読んでも意味がありません...そしてそれがおそらくあなたの不確実性の根源です.

静的という用語 (Java で) は、変数がインスタンスやメソッド呼び出しではなく、クラスに属していることを意味します。ここで としてラベル付けされてstaticいるのは変数です。変数と変数に含まれる値の違いは重要です。

オブジェクト参照を静的にすることはできません。静的性は、オブジェクト参照にとって意味のあるプロパティではありません。それは単に意味がありません。オブジェクト参照は値であり、変数ではありません。

static変数はオブジェクトへの参照を保持しますが、(一般に) それが含むオブジェクト参照 (またはそれが参照するオブジェクト) を静的にするわけではありません。用語の問題に加えて、static変数を変更すると、変数が最初に参照していたオブジェクトがなくなる可能性があります。それは明らかに非静的な動作です。

instance実際、変数の静的性とqueue直交する問題です。変数がとして宣言されている場合、変数staticは静的です。そうでなければ、そうではありません。

これで、コードは1のインスタンスが 1 つしか存在しないことを保証しますStaticObjectReferencestaticしかし、それはあなたがクラスを書いた方法の緊急の特性であり、これら2つの変数の宣言(またはその他)とは何の関係もありません. そして、このプロパティを「静的性」とは呼びません。私たちはそれを「シングルトンネス」と呼んでいます...私の英語の乱用を許していただければ...


1 - 実際には、書かれているようにスレッドセーフではないため、常に保証されるわけではありません。

于 2013-01-10T02:54:41.910 に答える