2016-07-28 16 views
0

Code A funktioniert gut, ich denke Code B kann korrekt funktionieren, aber Code B funktioniert nicht richtig. Warum?Warum kann ich ein Objekt in einer Funktion in Java nicht erstellen?

Warum kann ich kein Objekt in der Funktion private void SetField(Context mContext,MAtt aField,String name) erstellen?

Code A

public class MURLPar { 

    public MAtt diskcount=new MAtt(); 
    public MAtt diskindex=new MAtt(); 


    public MURLPar(Context mContext){ 
     SetField(mContext,diskcount,"Pardiskcount"); 
     SetField(mContext,diskindex,"Pardiskindex"); 
    } 


    public class MAtt { 
     public String name; 
     public String value; 
    } 


    private void SetField(Context mContext,MAtt aField,String name){ 
     int id = mContext.getResources().getIdentifier(name, "string", mContext.getPackageName()); 
     aField.name=mContext.getString(id); 
    } 
} 

-Code B

public class MURLPar { 

    public MAtt diskcount; 
    public MAtt diskindex; 


    public MURLPar(Context mContext){ 
     SetField(mContext,diskcount,"Pardiskcount"); 
     SetField(mContext,diskindex,"Pardiskindex"); 
    } 


    public class MAtt { 
     public String name; 
     public String value; 
    } 


    private void SetField(Context mContext,MAtt aField,String name){ 
     aField=new MAtt(); //Create object 
     int id = mContext.getResources().getIdentifier(name, "string", mContext.getPackageName()); 
     aField.name=mContext.getString(id); 
    } 
} 
+0

Was ist 'MAtt' eine Schnittstelle ? –

+0

Was sagt der Fehler? – Shaishav

+0

Die Frage definiert nicht klar über: "Code B funktioniert nicht richtig". Aber es ist kein Kompilierungsfehler. Es kann sich um einen Geschäftslogikfehler handeln. – NangSaigon

Antwort

2

Was in Code B passiert, ist, dass der MURLPar Konstruktor übergibt einen Verweis auf diskcount/diskindex-SetField, die innerhalb dieser Methode aField den Namen hat.

Anschließend weisen Sie aField mit einem Verweis auf ein neu erstelltes Objekt neu zu, und Sie bearbeiten dann dieses Objekt. Beachten Sie, dass sich aField jetzt auf ein vollständig separates Objekt bezieht, und nicht auf das, worauf es Bezug genommen hat, als Sie SetField eingegeben haben.

Wenn Sie mit C vertraut sind, können Sie sich vorstellen, was Sie hier als etwas in dieser Richtung tun:

void SetField(MAtt *aField) { 
    aField = (MAtt*) calloc(1, sizeof(MAtt)); 
} 

MAtt *diskcount; 
SetField(diskcount); 

Und dann diskcount erwartet nach dem Aufruf von SetField geändert zu haben, die es offensichtlich werde nicht haben.


Wenn Sie so etwas wie ein out-Parameter möchten, können Sie die Simulation durch eine neu erstellte Objekt zurückkehr:

private MAtt SetField(Context mContext, String name){ 
    MAtt aField = new MAtt(); //Create object 
    int id = mContext.getResources().getIdentifier(name, "string", mContext.getPackageName()); 
    aField.name=mContext.getString(id); 
    return aField; 
} 

Und dann:

diskcount = SetField(mContext, "Pardiskcount"); 
4

Da aField bekommt neue Speicheradresse, wenn Sie den Befehl aField=new MAtt();

Als Ergebnis Speicheradresse diskcount und diskindex bleibt nicht initialisiert.

Weitere Check hier: https://stackoverflow.com/a/73021/3923800