2010-06-23 8 views
0

Je ne suis pas sûr s'il s'agit d'un comportement Java ou d'un comportement GWT non autorisé. Mais voilà. J'ai une classe pour les vecteurs 2D, appelée Vecteur2. Dans mon programme, je fais une simulation de particules 2D représentées par des instances de cette classe. J'ai deux tableaux de Vector2, m_x et m_oldx qui sont membres d'une autre classe, avec une fonction qui effectue un traitement. Une partie de cette fonction est la suivante, et je suis terriblement confus par son comportement:Comportement embarrassant (instances Java, tableaux et GWT)

Vector2 old = m_x[i]; 

Vector2 test = new Vector2(9.0f,9.0f); 
m_x[i] = test; 

// 1: at this point, m_x[i]'s values are 9.0,9.0 
m_oldx[i] = old; 
// 2: at this point, m_x[i]'s values are 100.0,100.0 - their original values before I assigned test to m_x[i]! 

Donc, fondamentalement, il semble que, en vertu du fait que j'attribue vieux au tableau de m_oldx, m_x [i] » La valeur s est réinitialisée à sa valeur d'origine! Ce n'est plus égal à la variable de test que je lui ai assignée plus tôt.

Sûrement que ça ne peut pas être vrai? Mais c'est ce qui se passe pour moi. Je dois dire à nouveau que j'utilise GWT ici - c'est-à-dire que ce code est compilé jusqu'à Javascript par le compilateur de Google. Est-ce un comportement java normal ou est-ce que GWT fait quelque chose de mal? Merci pour toute aide ... déchirer mes cheveux :(

+0

Je soupçonne que quelque chose d'autre se passe ici. Pouvez-vous poster un court test pour montrer le comportement? En outre, la classe avec ces données est-elle utilisée par plus d'un thread? –

+1

pourriez-vous nous donner le code où vous créez m_x et M_oldx? – tlayton

Répondre

3

Lorsque des problèmes de ce type surviennent, je pense d'abord que m_x et m_oldx ont été définis l'un sur l'autre à un moment donné, car Java transmet les instances aux variables par valeur plutôt qu'en créant une copie. Par exemple, si à tout moment vous avez:

m_oldx = m_x; 

ou

m_x = m_oldx; 

il causerait ce problème.

+0

Arrrggghhh ... vous avez raison. J'avais placé les deux pour référencer un autre tableau, chacun se référant à la même chose. J'ai clairement besoin de réviser ma logique de référence Java! Merci beaucoup, j'aurais probablement été toute la nuit sinon. – Peter

+1

Bien que vous vouliez probablement le corriger, votre réponse contient beaucoup d'objections: Java n'a pas de pointeurs, mais les références et leur nom peuvent être source de confusion et laisser les autres penser que vous pouvez faire du pointeur-arithmétique avec eux. De plus, Java n'a qu'un moyen de passer (des instances) d'objets: par valeur (la référence est copiée par valeur!), L'appeler "passant par pointeur", est trompeur (voire faux). –

+0

Vous avez bien sûr raison. J'ai utilisé une mauvaise terminologie dans ma réponse. Il a été corrigé en conséquence. – tlayton

2

Il semble que m_x et m_oldx sont en fait le même tableau, afin de modifier une variable modifie l'autre et vous avez probablement plus tôt.

m_oldx = m_x; 
.

en raison de la sémantique de référence d'objet de Java faisant m_oldx = m_x n'a pas copie le tableau, il suffit simplement de définir m_oldx pour pointer vers le même tableau que m_x Si vous voulez copier vous devez le faire explicitement:

m_oldx = Arrays.copyOf(m_x, m_x.length);