2010-09-28 43 views
58

¿Cómo incremento el valor de un Entero en Java? Sé que puedo obtener el valor con intValue, y puedo configurarlo con el nuevo Integer (int i).Incrementar el valor int de un entero?

playerID.intValue()++; 

parece que no funciona.

Nota: PlayerID es un número entero que ha sido creado con:

Integer playerID = new Integer(1); 
+7

¿Por qué usa enteros en lugar de enteros? – naiad

+2

@naiad Para mí, generalmente se debe a que no se pueden usar tipos primitivos como argumentos genéricos en Java. –

Respuesta

72

Integer objetos son inmutables, por lo que no se puede modificar el valor una vez que se haya creado. Tendrá que crear un nuevo Integer y reemplazar el existente.

playerID = new Integer(playerID.intValue() + 1); 
+2

Si debe utilizar un int no primitivo, y desea mutabilidad, puede probar los comunes MutableInt http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/mutable/MutableInt.html – Joel

+0

gracias, pero por alguna razón todavía no se incrementa. Tal vez es un error en mi código ... – William

+1

@William: Como sé, se incrementará solo en el método que lo incremente. –

7

Los objetos enteros son inmutables. No se puede cambiar el valor del entero en poder del objeto en sí mismo, sino que sólo puede crear un nuevo objeto de entero a aguantar el resultado:

Integer start = new Integer(5); 
Integer end = start + 5; // end == 10; 
3

Se puede utilizar como alternativa IntHolder mutable a entero. Pero, ¿vale la pena?

42

Como dice Grodriguez, los objetos Integer son inmutables. El problema aquí es que está tratando de incrementar el valor int del ID del jugador en lugar de la ID. En Java 5+, puede escribir playerID++.

Como nota al margen, nunca llame al constructor de Integer. Aproveche el autoboxing simplemente asignando int s al Integer s directamente, como Integer foo = 5. Esto utilizará Integer.valueOf(int) de forma transparente, que es superior al constructor porque no siempre tiene que crear un nuevo objeto.

6

Para Java 7, el operador de incremento '++' funciona en enteros. A continuación se muestra un ejemplo probado

Integer i = new Integer(12); 
    System.out.println(i); //12 
    i = i++; 
    System.out.println(i); //13 
+1

Pero tenga en cuenta que otras referencias a 'i = new Integer (12)' seguirán refiriéndose a '12', no a' 13' ... es fácil tropezar con esto – vikingsteve

+1

sí, es por eso que debe reasignar el valor al objeto entero: i = i ++ – KillBill

+2

'i = i ++' no es lo mismo que 'i ++'. Técnicamente, el '++' no funciona en enteros, diría que no puedes usarlo solo sin asignar el resultado a algo. –

6

Tal vez esto es de algún valor también: hay una clase Java llamada AtomicInteger (ver https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html). Esta clase tiene algunos métodos útiles como addAndGet(int delta) o incrementAndGet() (y sus contrapartes) que le permiten incrementar/disminuir el valor de la misma instancia. Aunque la clase está diseñada para usarse en el contexto de concurrencia, también es bastante útil en otros escenarios y probablemente se ajuste a sus necesidades.

1

Tal vez usted puede probar:

final AtomicInteger i = new AtomicInteger(0); 
i.set(1); 
i.get(); 
3

Java 7 y 8. Incremento sí cambia la referencia, por lo que hace referencia a otro objeto entero. Mire:

@Test 
public void incInteger() 
{ 
    Integer i = 5; 
    Integer iOrig = i; 
    ++i; // Same as i = i + 1; 
    Assert.assertEquals(6, i.intValue()); 
    Assert.assertNotEquals(iOrig, i); 
} 

Entero solo es inmutable.

Cuestiones relacionadas