2017-09-08 20 views
0

ここに私の例があります:nullで初期化された引数を渡し、後で正しい値でオブジェクトを初期化できるかどうかを知りたい。nullで初期化されたクラスオブジェクト間の参照

private class Source { 
    String str; 
    String getStringValue() { 
    return str; 
    } 
    void setStringValue(String str) { 
    this.str = str; 
    } 
} 

private class UserSource { 
    Source src; 
    UserSource(Source src) { 
    this.src = src; 
    } 
    String getValue() { 
    return src.getStringValue(); 
    } 
    void setValue(String str) { 
    src.setStringValue(str); 
    } 
} 

ここで私はどのように使用していますか。

Source srcW = new Source(); 
    UserSource userSourceW = new UserSource(srcW); 
    srcW.setStringValue("Second Value"); 
    System.out.println("From UserSource:" + userSourceW.getValue()); 
    userSourceW.setValue("Is not Second"); 
    System.out.println("From Source:" + srcW.getStringValue()); 

出力:

From UserSource:Second Value 
From Source:Is not Second 

しかし、のように使用することが可能であるかどうかを知りたい:出力は

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 

はです。もちろん

Source srcN = null; // YES I want to assign Not initialized! 
    UserSource userSourceN = new UserSource(srcN); 
    srcN = new Source(); 
    srcN.setStringValue("First Value"); 
    System.out.println("From UserSource:" + userSourceN.getValue()); 

そこに代替?

答えて

0

残念ながら、それはできません。値が最初にnullの場合、nullの参照を渡しています。後でsrcN = new Source();で初期化しますが、ソースを書き換えています。

Reference<Source>で回避できます。しかしそれはコードをもっと煩雑にするだけです。さらに、Sourceクラスは空のソースとして渡すのに最適な候補です。その後、setString()で後で初期化します。

何か不足していますか?コードの問題は何ですか?

関連する問題