2017-02-08 4 views
0

簡単にするために、私は問題の原因となるキー要素で発生しているエラーを再現しました。クラスのJavaの異なるインスタンス

私は3つのメインクラスを持っています。最初は、メソッドを初期化して設定するメインクラスです(メイン)。それから私はデータベースからコード(Init)にデータを引き出すデータベースクラスを持っています。第3に、GUI要素(アクセサー)を処理するGUIクラスがあります。

accessor.print()を呼び出すと、メインクラス(init.setUp)からデータベースクラス(accessor.setUp)で初期化した変数(メッセージ)がnullとして表示されるという問題が発生しました。メソッドをGUIクラスのActionListenerEventの後に追加します。

同じクラスのインスタンスが異なるため、この問題が発生することがありますが、解決方法がわかりません。

public class Init { 
    public String message; 

    public void setUp(){ 
     message="Hello World"; 
    } 
    public void print(){ 
     System.out.println(message.length()); 
    } 
} 

これは、アクセサクラスは次のとおりです:事前に

public class Accessor { 
    public void tryAccess(){ 
     Init init=new Init(); 
     init.print(); 
    } 
} 

おかげ

public class main { 
    public static void main(String[] args){ 
     Init init=new Init(); 
     init.setUp(); 

     Accessor acc=new Accessor(); 
     acc.tryAccess(); 
    } 
} 

これは、初期化クラスがある:

これはメインのクラスです。

+4

なぜ、別々のインスタンスを使用していますか? – shmosel

+1

作成されたinitインスタンスは、コンストラクタまたはtryAccess()メソッドの引数としてアクセサに渡すことができます。したがって、Initのインスタンスは1つだけです。また、インスタンス間でアクセスする必要がある場合は、静的変数としてメッセージを宣言することもできます。 – Santo

答えて

2

あなたはあまりにも多くのInitオブジェクトを持ち、1つは他のオブジェクトに関連していません。 1つを設定することは他のものに影響を及ぼさないことが明らかであり、これを解決するには、1つのインスタンスが必要であり、必要とするだけです。

public class main { 
    public static void main(String[] args){ 
     Init init=new Init(); 
     init.setUp(); 

     Accessor acc=new Accessor(init); // pass it in! 
     acc.tryAccess(); 
    } 
} 

public class main { 
    public static void main(String[] args){ 
     Init init=new Init(); 
     init.setUp(); 

     Accessor acc=new Accessor(); 
     acc.tryAccess(); 
    } 
} 

を変更し、アクセサオブジェクトの初期化フィールドにパラメータ初期化オブジェクトを渡します。

public class Accessor { 
    private Init init; 

    public Accessor(Init init) { 
     this.init = init; // initialize field 
    } 

    public void tryAccess(){ 
     // Init init=new Init(); // *** don't create a new instance!! *** 
     init.print(); 
    } 
} 
+0

ああ、それは私が思ったよりもはるかに簡単です、そのおかげで。 :) – Nightfortress

+0

@Nightfortress: 'new'キーワードを使用すると、いつでも何かの新しい独立したインスタンスが作成されることを理解しています。時々あなたはそれらを数える必要があります。 –

関連する問題