avec une API tiers J'ai observé ce qui suit.
Au lieu d'utiliser, P>
public static void getString(String output){ }
8 Réponses :
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" }
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"); }
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.
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: p> mais iMho ceci craint sur plusieurs niveaux. :) p> 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. P> p>
Parfois, ce mécanisme peut éviter la création d'un nouvel objet. P>
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. P>
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). P>
La création d'objets est bon marché et doit pas i> 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 i> 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
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 void handle(Request r) {
doStuff(r.getContent());
r.changeState("foobar");
r.setHandled();
}
À mon avis, cela est utile lorsque vous avez plus d'un résultat dans une fonction. P>
À 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.
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); }
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.
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> 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());
}
Cet exemple est faux. Java n'a pas de paramètres de sortie.
@ Bombe: JavaPracces.com/topic/topicaction.do?id=37 a>
@Chathuranga: Regardez de plus près l'exemple. Il utilise un stringbuilder non une chaîne !!
Cet objet de chaîne est-il le java.lang.string? (qui est immuable)