2015-04-08 1 views
-3

J'avais une question concernant ... les paramètres en java. Voici l'exemple de codeUtilisation de ... paramètres en Java

class Foo{ 

    private void m1(Object... params){ 
     //do something with params[0] 
     //do something with params[1] 
     //do something with params[2] 
     //do something with params[3] 
    } 

    public void m2(Object... params){ 
     Object additionalParam = new Object(); 
     m1(additionalParam, params); 
    } 

} 
class Example{ 

    public void main(String[] args){ 
     Foo f = new Foo(); 
     Object o1 = new Object(); 
     Object o2 = new Object(); 
     Object o3 = new Object(); 
     f.m2(o1, o2, o3); 
    } 
} 

Est-ce que quelque chose comme ça fonctionne? Je n'ai pas eu d'erreur de compilation, mais lorsque je faisais quelque chose de similaire, j'ai eu des problèmes en changeant la valeur de l'un des objets de m1().


SOLUTION: Je pense que le tableau serait aplati, mais apparemment cela ne se produit pas.

class Foo{ 

    private void m1(Object... params){ 
     //do something with params[0] 
     //do something with params[1][0] 
     //do something with params[1][1] 
     //do something with params[1][2] 
    } 

    public void m2(Object... params){ 
     Object additionalParam = new Object(); 
     m1(additionalParam, params); 
    } 

} 
class Example{ 

    public void main(String[] args){ 
     Foo f = new Foo(); 
     Object o1 = new Object(); 
     Object o2 = new Object(); 
     Object o3 = new Object(); 
     f.m2(o1, o2, o3); 
    } 
} 

Merci, Sibbo pour votre contribution.

+0

Quel est ce problème? –

+3

ne résulterait pas en une régression infinie en raison de l'invocation répétée d'un nombre croissant d'arguments? –

+0

Quels sont les problèmes? S'il vous plaît expliquer plus. – Maroun

Répondre

1

Vous transmettez deux arguments à m1. L'un est un Object (A), et un Object[] (B). Pour accéder à A, vous pouvez utiliser params[0], mais pour accéder à n'importe quel élément i à partir de B, vous devez utiliser params[1][i].

Ainsi, si vous vous attendiez à ce que le tableau résultant soit aplati, non, il ne le sera pas.

Si vous souhaitez modifier les valeurs stockées dans la matrice transmise par la méthode main, faites-le comme dans votre deuxième exemple. Si vous voulez le faire bien, utilisez les types appropriés au lieu de Object.

+0

J'ai en effet découvert que c'était l'un des problèmes, même si ce n'est pas la solution. Merci quand même –

+0

Que demandez-vous? – Sibbo

+0

L'autre réponse est ma solution, même si je ne peux pas l'accepter pour un autre 5 minutes: P –

0

Le paramètre (TYPE ... NAME) indique simplement "passer dans un certain nombre d'objets de type TYPE". Ceux-ci peuvent ensuite être accédés régulièrement via NAME [x] où x est l'indice de l'objet que vous avez passé.

EDIT: La deuxième partie de ma réponse était erronée. Désolé pour toute confusion.

+0

Les objets ne sont pas copiés. Java passe les objets par référence. – Sibbo

+0

Vous vous trompez partiellement, java crée une copie qui est vraie, mais pas de l'objet lui-même, il crée une copie de la valeur de référence qui à la fin fait référence à l'objet lui-même. – SomeJavaGuy

+0

@KevinEsche Fait-il référence à la variable ou fait-elle référence à sa valeur? –

0

Les paramètres varargs sont traités par le compilateur comme un tableau. Donc, votre exemple devra ressembler à ceci:

class Foo{ 

    private void m1(Object... params){ 
     //do something 
    } 

    public void m2(Object... params){ 
     Object additionalParam = new Object(); 
     Object[] newArray = /* Here you need to create an array with all param elements and the new one*/ 
     m2(newArray); 
    } 

} 
class Example{ 

    public int main(String[] args){ 
     Foo f = new Foo(); 
     Object o1 = new Object(); 
     Object o2 = new Object(); 
     Object o3 = new Object(); 
     f.m2(new Object[]{o1, o2, o3}); 
    } 
} 
+0

uhm, vous connaissez la différence entre Object ... et Object [], n'est-ce pas? –

+1

"Différence" n'est pas le bon mot ici. Varargs (le "...") vous permet de passer un nombre quelconque d'objets en tant que paramètre donné, donc null, 0, un ou un tableau. Quoi que vous passiez, dans le code de la méthode, il sera traité comme un tableau (qui est soit nul, vide, a seulement l'index 0 etc ...) – Kelevandos

+0

S'il vous plaît marquer la réponse comme la solution si elle a aidé.Merci :-) – Kelevandos