2011-11-22 7 views
6

基本クラスに2つの静的オブジェクトを作成するJavaアプリケーションがあります。これらのオブジェクトはプログラム内のクラス全体で参照する必要があります。アプリケーション全体で1つのクラスで作成された静的オブジェクトの参照

public class Baseclass{ 
    public static ClassA A = new ClassA(); 
    public static ClassB B = new Classb(); 
    ... 
    ... 
    ... 
} 

これらのオブジェクトは、ローカルプライベート変数として他のクラスで参照されます。

public class ClassA{ 
    private ClassB b = Baseclass.B; 

はしかし、両方のオブジェクトが機能するためにお互いを必要とし、他が作成される前に、私はオブジェクトの一つの新しいインスタンスを作成する場合は、「上」クラス内のローカル変数がnullに設定されています。 Javaには、オブジェクトのコピーを作成するのではなく、実際のオブジェクト(ポインタのような)をオブジェクトに変数として参照する概念がありますか?

+4

の話をあなたの質問について

、私recomendationはこのような何かを行うです悪いデザイン.. – mre

+0

(ObPlead:どうか、変わった統計を使ってはいけません(以前はグローバルと呼ばれていましたが、シングルトンの反パターンを使用しています) –

答えて

6

あなたが探している答えは "シングルトンパターン"だと思います。ここでは、他の場所で使用するクラスのインスタンスを1つだけ作成します。ここにはgood link to readがあります。ここにはいくつかのJavaの例があるwikipedia page on itがあります。

は、だからあなたのコードは次のようになります:

public class A { 
    private final static A instance = new A(); 

    /* private constructor forces you to use the getInstance() method below */ 
    private A() {} 

    public static A getInstance() { 
     return instance; 
    } 
} 

を次に、あなたはあなたのようなものだろうAのインスタンスを取得したい場所:

public class B { 
    private final A classA = ClassA.getInstance(); 
    ... 
} 

は何の理由Aは可能性がありませんBのインスタンスもなく、独自のメソッドでBのメソッドを呼び出すこともできません。このクロス依存性ではできないことは、コンストラクタ内の他のメソッドのいずれかを呼び出すことです。

一般に、これらのパターンは控えめに使用する必要があります。これを実現するためのより良い方法は、グローバル参照ではなく依存性注入によるものです。クロスインジェクションは可能ですが、やり直してください。より良い解決策は、クラスをリファクタリングして線形の依存関係を持たせることです。

代わりにオブジェクトのコピーを作成する変数としてオブジェクトに(ポインタのような)実際のオブジェクトを参照しますJavaで任意の概念はありますか?

Javaは値渡しであるが(それらがメモリアドレスないがCでのポインタと同様に)、任意のオブジェクトの値はオブジェクトへの参照です。したがって、Aというインスタンスがあり、それを別のフィールドに割り当てると、そのフィールドは同じ値になり、Aの同じインスタンスを参照します。

// instantiate a new instance of A 
A a1 = new A(); 
// assign the reference to A to another variable 
a2 = a1; 
// they are equivalent and both reference the same object 
if (a1 == a2) ... 
1

代わりにオブジェクトのコピーを作成する変数としてオブジェクトに(ポインタのような)実際のオブジェクトを参照しますJavaで任意の概念はありますか?

実は、Javaはのみの参照を持っています。変数にオブジェクトが含まれていないがあるので、そこに心配はありません。あなたはJavaでの参照は、あなたが実際に参照のコピーを作っている作るとき

import static some.package.Baseclass.*; 
+0

オリジナルの投稿を編集して、「private classB」の行を構文的に正しいものにしました。とにかく私の編集が受け入れられるとすぐに... –

1

また、代わりに

private ClassB b = Baseclass.B; 

をやって、私はあなたが静的インポートを行うことを検討をお勧めしたいです。あなたの例ではBaseclass.Bをコピーしていません。 の参照Baseclass.Bにコピーしています。

bは、Baseclass.Bが定義されるまで、nullになります。 bの操作を行う必要がある場合は、ClassAの宣言では実行できません。オブジェクトaが作成された後に呼び出されるメソッドで行う必要があります。

0

これはシングルトンの古典的なアプリケーションです。それぞれの場合

  • は、コンストラクタをプライベートにします。
  • シングルトン を保持するために、クラスの独自の型のプライベートな静的メンバーを追加します。
  • 上記のメンバーがまだ設定されていない場合は、初期化するgetThe()メソッドを追加します。

wikipedia:Singleton patternを参照してください。

A構造体BのコンストラクタもgetThe()を実行して作成します。

また、Baseclassにはパブリックフィールドを使用しないでください。代わりにpublic getterメソッドを使用します。別のB変数を保持しないでください。その代わりに、シングルトンに尋ねてください。

0

代わりにコピーオブジェクトの を作るの変数としてオブジェクトに(ポインタのような)実際のオブジェクト を参照しますJavaで任意の概念はありますか?

あなたはこれを行うと:

private ClassB b = Baseclass.B; 

それが「B」変数が参照変数命名されているためだA本当にあなたが同じオブジェクトでポンティングされています。

まずencapsule参照:

public class ClassA{ 
    private ClassB b; 

    public void setB(ClassB b) { 
     this.b = b; 
    } 

    public ClassB getB(ClassB b) { 
     return this.b; 
    } 

} 

第二の変数初期化のための静的なブロックを使用して約

public class Baseclass{ 
    public static ClassA A = new ClassA(); 
    public static ClassB B = new Classb(); 
    static { 
     A.setB(B); 
     B.setA(A); 
    } 
} 
関連する問題