2017-09-08 4 views
0

Voici mon exemple: Je veux savoir s'il est possible de passer un argument initialisé avec null, et d'initialiser ensuite l'objet avec une valeur correcte.Référencement entre classe Objet initialisé avec 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); 
    } 
} 

Maintenant comment j'utilise.

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()); 

La sortie:

From UserSource:Second Value 
From Source:Is not Second 

Mais, veulent savoir s'il est possible d'utiliser comme:

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()); 

Bien sûr, la sortie est

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

Est il y a une alternative ?

Répondre

0

Malheureusement, ce n'est pas possible. Lorsque la valeur est initialement null, vous transmettez la référence null. Plus tard, vous l'initialisez avec srcN = new Source();, mais vous réécrivez la source.

Vous pouvez contourner ce problème avec un Reference<Source>. Mais cela ne ferait que rendre le code plus lourd. De plus, la classe Source est un candidat parfait pour la passer en source vide, puis l'initialiser plus tard avec setString().

Ai-je raté quelque chose? Quel est votre problème avec le code tel quel?