Estoy programando en Java por sólo unos pocos meses, así que no soy tan experimentado con Java (algunos trucos y las cosas básicas que debería saber, sin embargo).
Tengo un problema que puede ser obvio, pero yo no lo veo.
public class SomeClass {
private final int[] numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
private LabelText AText = new LabelText('A', numbers);
private LabelText BText = new LabelText('B', numbers);
public void foo() {
AText.numbers[6] = -1;
BText.numbers[3] = -1;
if (BText.numbers[6] == -1) System.out.println("Wtf?");
}
}
Este es un extracto de mi código.
¿Cómo puede ser esto cierto? Estos son dos objetos separados. Yo no lo entiendo.
El método se llama foo directamente en mi método principal (para propósitos de prueba).
Si necesita el constructor de labelText, aquí está:
public class LabelText {
private final char letter;
public int[] numbers;
public LabelText(char letter, int[] numbers) {
this.letter = letter;
this.numbers = numbers;
}
}
Debido a que usted está pasando una referencia a numbers
sin hacer una copia, por lo tanto los objetos terminan apuntando a la misma int[]
instancia . Mientras que hay dos diferentes objetos externos, el objeto interno que ambos punto a es el mismo objeto , por lo tanto, puede cambiar que objeto interno por eliminación de referencias cualquiera de AText.numbers
y BText.numbers
, y el cambio será visible en ambos de los objetos externos al acceder a sus numbers
campos .
Se puede comprobar que AText == BText
volverá false
, pero AText.numbers == BText.numbers
volverá true
. Y this.numbers == AText.numbers
también volverá true
.
Al igual que probar este mismo código, pero con este constructor:
public LabelText(char letter, int[] numbers) {
this.letter = letter;
this.numbers = numbers.clone(); // so it will always be unique array here
}