2011-12-05 6 views
0

Possible en double:
How to implement int in/out params in javaEst-ce que java supporte les paramètres?

Dire que je veux écrire une méthode qui retourne un objet utilisateur, et aussi je veux modifier l'énumération UserStatus.

En C# je pouvais faire:

public User InsertNewUser(User newUser, out UserStatus userStatus) 
{ 

} 

SORTIR (http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.80).aspx) me donne essentiellement plusieurs objets qui se 'retournés'.

Curieux si java a ceci?

+0

Selon mes connaissances - NON. – Bhushan

+0

duplication possible de [Comment implémenter int in/out params dans java] (http://stackoverflow.com/questions/8355404/how-to-implement-int-in-out-params-in-java) et [Comment pour créer des paramètres IN OUT ou OUT en Java] (http://stackoverflow.com/questions/4455693/how-to-create-in-out-or-out-parameters-in-java) –

+1

et si vous vous demandez * pourquoi *, voir [Pourquoi Java n'utilise-t-il pas le paramètre out dans sa syntaxe de langage alors que C# fait?] (http://stackoverflow.com/questions/1044452/why-does-java-not-use-the-out- paramètre-dans-sa-langue-syntaxe-while-c-sharp-doe) –

Répondre

1

Vous ne pouvez pas modifier la référence UserStatus entrante, car Java est transmis par valeur, mais vous pouvez modifier son état s'il est modifiable.

public class UserStatus { 

    private String status; 

    public static void main(String [] args) { 
     String name = ((args.length > 0) ? args[0] : "stas"); 
     User user = new User(name); 
     UserStatus status = new UserStatus(); 
     System.out.println(String.format("before: user %s status %s\n", user.toString(), status.toString())); 
     user = insertNewUser(user, status); 
     System.out.println(String.format("after : user %s status %s\n", user.toString(), status.toString())); 
    } 

    public static User insertNewUser(User user, UserStatus status) { 

     User newUser = new User(user.getName() + "-changed"); 


     status = new UserStatus("SUCCESS"); // Won't work as expected because Java is pass by value 
     //status.setStatus("SUCCESS"); // Uncomment this and see that it's the only way to change the status flag 

     return user; 
    } 

    public UserStatus() { this.status = "UNKNOWN"; } 
    public UserStatus(String value) { this.status = value; } 

    public String getStatus() { return this.status; } 
    public void setStatus(String status) { this.status = status; } 
    public String toString() { return this.status; } 
} 

class User { 
    private final String name; 

    public User(String name) { this.name = name; } 


    public String getName() { return this.name; } 
    public String toString() { return this.name; } 
} 
+1

java est seulement transmis par valeur pour les types de données primitifs. Tous les objets sont transmis par référence. –

+0

ok c'est la même chose que C#, ce qui signifie que je peux changer l'état mais pas la référence. c'est-à-dire que si je change UserStatus, cela sera reflété dans la portée des appelants. Je suppose que 'out' rend simplement ce processus/flux plus visible et explicite. – codecompleting

+0

@stas Java est une valeur de passage uniquement; même les références sont transmises par valeur. –

-1

Si vous souhaitez modifier le userStatusout est implicite et non facultative. Si vous avez été défini userStatus sur un nouvel objet, il se référera à ce nouvel objet.

+0

Tout à fait faux. Essayez-le et voyez; Je vais vous montrer à quel point vous vous trompez. – duffymo

+0

Si vous créez un nouvel objet à l'intérieur de la méthode, la référence est hors de portée lorsque vous quittez la méthode. Rien ne s'y réfère, donc il est éligible pour la collecte des ordures. – duffymo

0

Java n'a rien de similaire. Les variables seront passés par référence, afin que vous puissiez faire:

UserStatus myStatus = new UserStatus(); 
User myUser = insertNewUser(someUser, myStatus); 
System.out.println(myStatus); 

Ci-dessus, MyStatus sera mis à jour par votre fonction, mais comme vous pouvez le voir, vous devez l'initialiser avant de passer, à la différence avec un C# sur la variable .

Questions connexes