7
votes

Paramètres de sortie en Java

avec une API tiers J'ai observé ce qui suit.

Au lieu d'utiliser, P>

public static void getString(String output){

}


8 Réponses :


25
votes

Quelque chose ne va pas dans votre exemple.

public static void main(String[] args) {
    String x = "foo";
    Holder<String> h = new Holder(x);
    getString(h);
    System.out.println(h.value);
}

public static void getString(Holder<String> output){
    output.value = "Hello World"
}


0 commentaires

1
votes

Cette fonctionnalité a un gros inconvénient - cela ne fonctionne pas. Les paramètres de fonction sont locaux pour fonctionner et l'affectation n'a aucun impact en dehors de la fonction.
D'autre part,

void getString(StringBuilder builder) {
    builder.delete(0, builder.length());
    builder.append("hello world");
}


2 commentaires

Pourquoi utiliser un StringBuilder du tout?


Demandez-vous «Qu'est-ce que l'utilisation de StressBuilder» ou «Pourquoi utiliser StressBuilder dans ce cas»? En règle générale, StringBuilder est destiné au bâtiment de chaîne rapide et à la concaténation (comme son nom l'indique). Dans ce cas, c'est le seul moyen d'atteindre l'effet souhaité (valeur de chaîne de retour en modifiant l'argument de fonction). Vous ne pouvez pas faire cela avec un objet de chaîne car il est immuable.



5
votes

Cet exemple est faux, Java n'a pas de paramètres de sortie.

Une chose que vous pourriez faire pour émuler ce comportement est la suivante: xxx

mais iMho ceci craint sur plusieurs niveaux. :)

Si vous voulez une méthode pour renvoyer quelque chose, faites-la renvoyer. Si vous devez retourner plusieurs objets, créez une classe de conteneur pour mettre ces objets dans et retourner cela.


0 commentaires

1
votes

Parfois, ce mécanisme peut éviter la création d'un nouvel objet.

exemple: Si un objet approprié existe de toute façon, il est plus rapide de le transmettre à la méthode et de changer de champ.

Ceci est plus efficace que de créer un nouvel objet à l'intérieur de la méthode appelée et de renvoyer et d'attribuer sa référence (produisant des ordures à collecter un jour).


2 commentaires

La création d'objets est bon marché et doit pas Soyez la raison d'encombrer votre code avec des constructions sans autre objectif que de réduire le nombre d'objets créés.


@Bombe: (1) Même si la création de l'objet est bon marché, la création d'objets et ne peut pas être moins chère que celle d'attribuer (2) ce n'est pas seulement la création que les coûts; Il y a aussi une collociation à la poubelle qui coûte. (3) Il y a Java Evironments où la création d'objets est extrêmement chère (carte Java). Ici, la création d'objets devrait être évitée dans la mesure du possible



1
votes

String est immuable, vous ne pouvez pas utiliser les paramètres Pseudo Sortie de Java avec des objets immuables.

En outre, la portée de sortie em> est limitée à la méthode getstring em>. Si vous modifiez la variable sortie em>, l'appelant ne voit rien. P>

Ce que vous pouvez faire, cependant, change l'état fort> de la paramètre. Considérez l'exemple suivant: P>

void handle(Request r) {
    doStuff(r.getContent());
    r.changeState("foobar");
    r.setHandled();
}
  • Vous n'avez pas besoin de retourner un objet spécial contenant le nouveau contenu et si le traitement doit s'arrêter. Cet objet ne serait utilisé qu'une seule fois et créerait la mémoire de récupération d'objets et de la puissance de traitement. LI>
  • Vous n'êtes pas obligé de créer un autre objet de demande et de laisser le collecteur des ordures se débarrasser de l'ancienne référence obsolète maintenant. Li>
  • Dans certains cas, vous ne peut pas strud> créer un nouvel objet. Par exemple, parce que cet objet a été créé à l'aide d'une usine et que vous n'ayez pas accès à celui-ci, ni parce que l'objet avait des auditeurs et vous ne savez pas comment dire aux objets qui écoutaient l'ancienne demande qu'ils devraient à la place. Écoutez la nouvelle demande. LI> ul> p>


0 commentaires

0
votes

À mon avis, cela est utile lorsque vous avez plus d'un résultat dans une fonction.


1 commentaires

À mon avis, il s'agit d'un moyen très moche et mauvais de retourner plus d'un résultat. Au lieu de cela, créez une classe (haricot) qui contient les multiples choses que vous devez revenir et laissez la méthode renvoient une instance de cela. Légèrement pire: renvoyer un objet [] contenant les multiples choses.



3
votes

Je suis en désaccord avec Jasper: "À mon avis, il s'agit d'une façon très laide et mauvaise de retourner plus d'un résultat". Dans .net, il existe une construction intéressante qui utilise les paramètres de sortie:

if (myList.Contains(theKey))
{
  obj = myList.Get(theKey);
}


1 commentaires

Je ne sais pas si une réponse ou un commentaire a été supprimé, mais je ne vois aucune mention de «Jasper» ailleurs sur cette page. La question portait sur Java, mais cette réponse discute de .net sans rien fournir utile pour une utilisation à Java par l'OP.



1
votes

En réalité, il est impossible d'avoir des paramètres en Java, mais vous pouvez faire un travail autour de la mise en évidence sur une référence de référence pour la chaîne immuable et les primitives en écrivant une classe générique où l'immuable est le générique avec le Valeur et réglage et getter ou en utilisant un tableau où l'élément 0 (1 de 1 de longueur) est la valeur à condition d'être instantie en premier car il y a des situations dans lesquelles vous devez retourner plus d'une valeur où vous devez écrire une classe juste pour les renvoyer où La classe n'est utilisée que là-bas n'est qu'un gaspillage de texte et non vraiment réutilisable.

Être un C / C ++ et aussi .NET (Mono ou MS), il me pousse que Java ne supporte pas au moins une -ference pour les primitives; Donc, je recours au tableau à la place. P>

Voici un exemple. Disons que vous devez créer une fonction (méthode) pour vérifier si l'index est valide dans la matrice, mais vous souhaitez également renvoyer la longueur de restement après la validation de l'index. Appliquez-le en C en tant que 'Bool Validate_index (INT Index, int Arr_len, INT & REM)'. Un moyen de faire cela en Java serait 'Boolean Validate_index (INT Index, int Arr_len, int [] REM1)'. REM1 signifie simplement que le tableau contient 1 élément. p> xxx pré>

maintenant si nous utilisons cela, nous pouvons obtenir à la fois le retour booléen et le reste. P>

 public static void main(String[] args)
 {
    int[] ints = int[]{1, 2, 3, 4, 5, 6};
    int[] aRem = int[]{-1};
    //because we can only scapegoat the de-ref we need to instantiate it first.
    Boolean result = validate_index(3, ints.length, aRem);

    System.out.println("Validation = " + result.toString());
    System.out.println("Remainding elements equals " + aRem[0].toString());

 }


0 commentaires