BufferedImage a passer en parametre - Java - Programmation
Marsh Posté le 09-03-2011 à 16:09:08
precision pour eviter que l'on me dise qu'est ce que c'est que cette maniere de faire ?
je n'ai pas trop le choix, on me demande de faire comme ca, mais je sais que c'est pas le top ! mais j'obeis !
Marsh Posté le 09-03-2011 à 16:43:00
dumoulex a écrit : |
normal, tu peux pas.
Par contre, ta méthode peut retourner le BufferedImage.
Code :
|
et le code appelant :
Code :
|
Marsh Posté le 10-03-2011 à 08:41:48
bon, je reformule !
je ne peux pas récupérer la BufferedImage en retour car mon retour est obligatoirement un entier dont j'ai également besoin. Avant je récupérais mon image en retour mais je dois changer mon code pour avoir un retour d'entier et ça, c'est non négociable !
pourquoi tu dis que je ne peux pas ? c'est vague comme explication !
ce code la, qui fait exactement la meme chose mais avec un entier, marche très bien (il fonctionne aussi avec StringHolder pour recuperer une chaine de caracteres) :
Code :
|
avec l'appel
Code :
|
avec ce code ma variable bi prend les valeurs :
valeur de bi : -1
valeur de bi : 5
valeur de bi : 5
le changement se fait donc bien.
ce n'est pas possible de faire un truc similaire avec BufferedImage ? ou une classe derivee ?
J'ai utilisé IntHolder car cela ne marche pas avec int (passage en argument par valeur) ni avec Integer (passage par reference mais type immutable donc creation d'une nouvelle zone memoire lors de la modification)
si ca marche pour IntHolder je suppose qu'il y a un moyen de le faire marcher avec tout type de classe
Marsh Posté le 10-03-2011 à 08:44:13
je sais que ca devrait surement marcher en encapsulant la bufferedImage dans une nouvelle classe que je pourrais implementer mais j'aimerais eviter si possible..
Marsh Posté le 10-03-2011 à 10:07:03
dumoulex a écrit :
|
Parce que tu passe la copie de la valeur de la référence ( ) et comme tu modifie une copie, à la sortie de la méthode, tu n'a pas modifié la référence d'origine. (pour ne pas te faire piéger, tu peux mettre final devant ton argument)
Code :
|
C'est d'ailleurs pour ça que quand tu encapsule le tout ça marche : tu ne modifie pas la référence.
Pour en savoir plus :
http://blog.xebia.fr/2011/01/13/le [...] reference/
Marsh Posté le 10-03-2011 à 10:52:11
j'ai trouvé ma solution, etant donné que ca me fais **** de recreer un nouvel objet je me suis penché sur Holder
et j'utilise la classe javax.xml.rpc.holders.ObjectHolder
avec ca c'est nickel
ObjectHolder oh = new ObjectHolder(null);
j'envoie mon objet
et je lui assigne ma bufferedImage
oh.value = maBufferedImage
et comme ca je peux la recuperer.
je comprend maintenant pourquoi ca marchait pas avant, si je reassigne une valeur a mon objet alors nouvel espace memoire et donc pas moyen de recuperer mes nouvelles donnees..
en tout cas ca marche maintenant.
je pense que je vais garder ce package de coté !
Marsh Posté le 10-03-2011 à 10:53:03
ReplyMarsh Posté le 10-03-2011 à 11:21:17
dumoulex a écrit : |
ça marche mais c'est vraiment très moche : tu utilise un truc qui n'a aucun rapport avec la choucroute... Si un mec repasse derrière, il va se poser des questions sur le pourquoi du comment tu as utilisé ça pour faire ça...
dumoulex a écrit : donc c'est nickel, pas de nouvelle classe et je garde mon retour d'entier ! |
ouais bah le retour d'entier, c'est pareil, je trouve ça assez, voir complètement moche : c'est pour savoir si la création de l'objet à réussi ou non ? Pourquoi ne pas utiliser le mécanisme d'exception qui est fait...pour ça ?
Marsh Posté le 10-03-2011 à 11:30:36
j'y peux rien, c'est mon boss qui me demande de faire le retour d'entier...
c'est un code de retour renvoyé depuis un serveur qui transite par ma fonction et etant donné qu'il y a environ 20 fonctions il faut qu'elles aient toutes le même type de retour a savoir int
donc du moment que je peux pas faire de return BufferedImage (contraintes obligatoire) j'ai pas le choix.
et au final, recreer une classe pour l'encapsuler ca revient exactement au meme qu'utiliser la classe ObjectHolder.
Marsh Posté le 09-03-2011 à 16:05:42
Bonjour,
voici mon soucis, je dois passer un bufferedImage en parametre d'une fonction pour pouvoir lui attribuer une valeur, mais cela ne marche pas...
j'ai une fonction du genre
et une autre qui fait :
cela m'affiche
image nulle
mon image bi reste a la valeur null alors que je lui attribue une image dans la fonction calcul()...
j'ai deja resolu ce probleme pour des int et des String en utilisant IntHolder et StringHolder, qui permettent un passage d'argument par adresse et surtout qui ne sont pas immutable comme String et Integer
mais je ne vois pas pourquoi cela ne marche pas avec un BufferedImage puisque c'est un objet donc le passage se fait par adresse... la modification devrait être prise en compte...
Je sais que ma question peut paraitre bizzare, donc je precise que je ne PEUX PAS passer ma bufferedImage en retour de fonction, ca marche, pas de soucis mais je dois absolument retourner un entier donc pas de retour possible de cette facon.
Et je ne souhaite absolument pas creer un nouveau type d'objet genre MonImage qui contiendrait une bufferedImage ou qqch comme ca..
si quelqu'un a une solution, ou tout du moins une explication ca serait super !
merci