Загадочное поведение (экземпляры Java, массивы и GWT) - PullRequest
0 голосов
/ 23 июня 2010

Я не уверен, является ли это поведением Java или мошенническим поведением GWT.Но здесь идет.

У меня есть класс для 2D векторов, который называется Vector2.В моей программе я делаю некоторые симуляции двумерных частиц, представленных экземплярами этого класса.У меня есть два массива Vector2, m_x и m_oldx, которые являются членами другого класса, с функцией, которая выполняет некоторую обработку.Часть этой функции заключается в следующем, и я ужасно смущен ее поведением:

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]!

Так что в основном получается, что в силу того факта, что я назначаю old массиву m_oldx, m_x [i] значение возвращается к исходному значению!Он больше не соответствует тестовой переменной, которую я ему назначил ранее.

Конечно, это не может быть правдой?Но это то, что происходит со мной.Я должен еще раз сказать, что я использую GWT здесь - то есть этот код компилируется в Javascript компилятором Google.Это обычное поведение Java или GWT делает что-то не так?Спасибо за любую помощь ... вырвать мои волосы: (

Ответы [ 2 ]

3 голосов
/ 23 июня 2010

Когда возникают подобные проблемы, я сначала думал, что в какой-то момент m_x и m_oldx были установлены равными друг другу, поскольку Java передает экземпляры в переменные по значению, а не путем создания копии.Например, если в любой момент у вас есть:

m_oldx = m_x;

или

m_x = m_oldx;

, это вызовет эту проблему.

2 голосов
/ 23 июня 2010

Похоже, что m_x и m_oldx на самом деле являются одним и тем же массивом, поэтому изменение одной переменной также приводит к изменению другой. Вы, вероятно, сделали это раньше:

m_oldx = m_x;

Поскольку семантика ссылки на объект Java делает m_oldx = m_x, а не копирует массив, он просто устанавливает m_oldx, чтобы указывать на тот же массив, что и m_x. Если вы хотите скопировать его, вам нужно сделать это явно:

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