Pregunta

Soy un novato de Java codificador y acabo de leer una variable de una clase entera puede ser descrito tres formas diferentes en el API. Tengo el siguiente código:

if (count.compareTo(0)) { 
            System.out.println(out_table);
            count++;
    }

Esto está dentro de un bucle y simplemente da salida a out_table.
Mi objetivo es encontrar la manera de ver si el valor en count > 0 entero.

Me di cuenta de la count.compare(0) es la forma correcta? o se trata de count.equals(0)?

Sé que el count == 0 es incorrecta. ¿Es esto correcto? ¿Hay un operador de comparación de valor donde su justo count=0?

¿Fue útil?

Solución

Los números enteros se autounboxed, por lo que sólo pueden hacer

if (count > 0) {
    .... 
}

Otros consejos

Para averiguar si un Integer es mayor que 0, se puede:

  • comprobar si compareTo(O) devuelve un número positivo:

    if (count.compareTo(0) > 0)
         ...
    

    Pero eso parece bastante tonto, ¿verdad? Mejor solo ...

  • autoboxing < sup> 1 :

    if (count > 0)
        ....
    

    Esto es equivalente a:

    if (count.intValue() > 0)
        ...
    

    Es importante tener en cuenta que "==" se evalúa como este, con el operando Integer sacó de la caja en vez del operando int en caja. De lo contrario, count == 0 volvería falsa cuando se inicializa como count new Integer(0) (porque las pruebas "==" para la igualdad de referencia).

1 Técnicamente, el primer ejemplo utiliza autoboxing (antes de Java 1.5 no podía dejar pasar una int a compareTo) y el segundo ejemplo se utiliza unboxing . La característica se combina a menudo simplemente se llama "autoboxing" para abreviar, que a menudo se extendió luego a llamar a los dos tipos de conversiones "autoboxing". Me disculpo por mi uso de la terminología laxa.

Es mejor evitar autoboxing innecesaria por 2 razones.

Por un lado, que es un poco más lento que int < int, ya que estás (a veces) la creación de un objeto adicional;

void doSomethingWith(Integer integerObject){ ...
  int i = 1000;
  doSomethingWith(i);//gets compiled into doSomethingWith(Integer.valueOf(i));

El problema más grande es que autoboxing oculto puede ocultar excepciones:

void doSomethingWith (Integer count){
  if (count>0)  // gets compiled into count.intValue()>0

Al llamar a este método con null arrojará un NullPointerException.

La división entre primitivas y objetos de envoltura en java siempre fue descrito como un kludge para la velocidad. Autoboxing casi oculta esto, pero no del todo - es más limpio sólo para no perder de vista el tipo. Así que si usted tiene un objeto entero, sólo puede llamar a compare() o intValue(), y si usted tiene la primitiva sólo comprobar el valor directamente.

También puede utilizar es igual a:

 Integer a = 0;

 if (a.equals(0)) {
     // a == 0
 }

que es equivalente a:

 if (a.intValue() == 0) {
     // a == 0
 }

y

 if (a == 0) {

 }

(el compilador de Java añade automáticamente intValue ())

Tenga en cuenta que autoboxing / autounboxing puede introducir una sobrecarga significativa (especialmente bucles dentro).

A pesar de que ciertamente se podría utilizar el método compareTo en una instancia de enteros, no está claro al leer el código, por lo que probablemente debería evitar hacerlo.

Java le permite utilizar autoboxing (ver http : //java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html) para comparar directamente con un int, por lo que puede hacer:

if (count > 0) { }

Y el Integer ejemplo count se convertirá automáticamente en un int para la comparación.

Si usted está teniendo problemas para entender esto, echa un vistazo en el enlace anterior, o imaginar que está haciendo esto:

if (count.intValue() > 0) { }

Una cosa más a tener en cuenta es si el segundo valor era otro objeto Integer en lugar de un literal '0', el operador '==' compara los punteros de objeto y no auto-unbox.

es decir:

Integer a = new Integer(0);   
Integer b = new Integer(0);   
int c = 0;

boolean isSame_EqOperator = (a==b); //false!
boolean isSame_EqMethod = (a.equals(b)); //true
boolean isSame_EqAutoUnbox = ((a==c) && (a.equals(c)); //also true, because of auto-unbox

//Note: for initializing a and b, the Integer constructor 
// is called explicitly to avoid integer object caching 
// for the purpose of the example.
// Calling it explicitly ensures each integer is created 
// as a separate object as intended.
// Edited in response to comment by @nolith

también puede ser que sea a última hora del este, pero me gustaría compartir algo:

Dada la entrada:     System.out.println (isGreaterThanZero (-1));

public static boolean isGreaterThanZero(Integer value) {
    return value == null?false:value.compareTo(0) > 0;
}

Devuelve false

public static boolean isGreaterThanZero(Integer value) {
    return value == null?false:value.intValue() > 0;
}

Devuelve true Así que creo que en yourcase 'compareTo' será más preciso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top