2016-03-30 11 views
1

Ich habe eine Java-Anwendung, bei der ein Objektreferenz "Validate.Options" als Parameter an die Funktion "ValidateResult (Validate.Options Option)" übergeben wird und die Funktion iterativ genannt wird. Innerhalb dieser Funktion wird basierend auf der bestimmten Bedingung die Eigenschaft "enableProcessing" des übergebenen Objekts geändert, die bei der nächsten Iteration nicht zurückgesetzt wird. Wie kann ich diese Eigenschaft zurücksetzen?Java-Programmierfehler Pass-by-Referenz

Unten ist der Beispielcode.

public interface Validate 
{ 
    public List validate(); 


    public class Options implements Serializable 
    { 
     public String name; 
     public boolean enableProcessing = true; 
     public Options(String name) 
     { 
      this.name = name; 
     } 
    } 
} 


public class Coder 
{ 
    public String name; 
    public int age; 
    public Coder(String name, int age) 
    { 
     this.name = name; 
     this.age = age; 
    } 

    public void ValidateResult(Validate.Options option) 
    { 
     if(option.name.equals(this.name) && option.enableProcessing) 
     { 
      option.enableProcessing = false; 
      // 
      //business logic and function call 
      // 
     } 
    } 

    public static void main(String[] args) 
    { 
     Validate.Options options = new Validate.Options("Test"); 
     List<Coder> coders = new ArrayList<Coder>(); 

     Coder coder = new Coder("Test", 28); 
     Coder coder1 = new Coder("XYZ", 18); 
     Coder coder2 = new Coder("Test", 16);  

     coders.add(coder); 
     coders.add(coder1); 
     coders.add(coder2); 

     for(Coder co : coders) 
     { 
      co.ValidateResult(options); 
     } 
    } 
} 
+0

Sie 'enableProcessing'to für coder1 wahr geworden ?? –

+1

Mögliches Duplikat von [Ist Java "pass-by-reference" oder "pass-by-value"?] (Http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass -by-value) –

+0

Sie übergeben die Optionen an validateResult() und Sie legen sie dort auf false fest. Was ist das Problem mit'options.enableProcessing = true'? – tak3shi

Antwort

2

Wenn ich die Frage richtig verstanden - in Ihrer for-Schleife, einfach eine Zeile Code fügen Sie den Wert Ihrer öffentlichen Validate.Options.enableProcessing Feld

for(Coder co : coders) 
    { 
     //reset options object for the next iteration 
     options.enableProcessing = true; 
     co.ValidateResult(options); 
    } 
1

Stellen Optionen zurücksetzen unveränderliche wenn Sie nicht wollen, dass es geändert werden:

public class Options implements Serializable 
{ 
    public final String name; // final prevents changes 
    public final boolean enableProcessing = true; // final prevents changes 
    public Options(String name) 
    { 
     this.name = name; 
    } 
} 

um lokal arbeiten mit enableProcessing kopieren Sie den Wert auf einen lokale Variable.

public void ValidateResult(Validate.Options option) 
{ 
    boolean enableProcessing = option.enableProcessing; // create local copy 
    if(option.name.equals(this.name) && enableProcessing) // use local copy 
    { 
     enableProcessing = false; // only change local copy 
     // 
     //business logic and function call 
     // 
    } 
} 

Alternativ erstellen neue, frische Optionen für jede Schleife:

public static void main(String[] args) 
{ 
    List<Coder> coders = Arrays. asList(
     new Coder("Test", 28), 
     new Coder("XYZ", 18), 
     new Coder("Test", 16) 
    ); 

    for(Coder co : coders) 
    { 
     Validate.Options options = new Validate.Options("Test"); // fresh options for each iteration 
     co.ValidateResult(options); 
    } 
}