2011-12-13 75 views
5

¿Cómo se evalúa la siguiente expresión?Autoboxing en Java

clase

Estudiante:

public class Student 
{ 
    private Integer id; 
    // few fields here 

    public Integer getId() 
    { 
     return id; 
    } 

    public void setId(Integer id) 
    { 
     this.id=id; 
    } 

    //setters and getters 
} 

Y en algún método:

{ 
    int studentId; 

    // few lines here 

    if(studentId==student.getId()) // **1. what about auto-unboxing here? Would it compare correctly? I am not sure.** 
    { 
     //some operation here 
    } 
} 
+2

No use las clases contenedoras a menos que sea absolutamente necesario. – mre

+0

Sí. lo que hiciste funcionaría No estoy seguro de que hayas preguntado algo más? – Guillaume

+0

+1 por no usar las clases contenedoras: mal efecto secundario potencial incluye NullPointerException no deseado (y oculto) arrojado por tu código – Guillaume

Respuesta

4

Sí, esto va a funcionar es equivalente a

studentId==student.getId().intValue() 

siempre student.id ¿no null .

+4

Solo por curiosidad, ¿cuáles son las reglas de boxeo y desempaquetado? Quiero decir, ¿por qué Java decide ** unbox ** el 'Entero' en lugar de ** recuadro ** el' int'? – bezmax

+1

es equivalente si student.id es nulo o no –

+0

Puede ser porque 'int' a la izquierda? – red1ynx

1

Sí, funcionará bien. Pero generalmente no es aconsejable usar la clase contenedora hasta que no haya otra.

3

Sí, esto funcionará, pero tenga en cuenta!

Si el valor id Entero en los estudiantes es nula, que tendrá una NullPointerException cuando se evalúa

studentId == student.getId(); 

Nótese también que autoboxing tendrá algún costo de rendimiento, por lo que sólo se debe utilizar si es necesario.

leer más aquí: http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

1

La comparación

studentId==student.getId() 

va a funcionar, pero arrojará un NullPointerException si student es null.

Como regla, el autoboxing prefiere primitivas, es decir, convertirá un Integer en int siempre que sea posible y no al revés. Su ejemplo muestra una buena razón para esto, ya que la igualdad para los objetos de referencia es complicada. Por lo tanto, es posible que:

studentId==student.getId().intValue() 

para ser verdad, pero

new Integer(studentId)==student.getId() 

es falso, ya que mientras ellos tienen el mismo valor que no eres el mismo objeto.

1

sí, va a trabajar, ya que se convertirá operando derecho al correspondiente tipo numérico, de acuerdo con la especificación del lenguaje Java:

Si los operandos de un operador de igualdad son ambos de tipo numérico, o uno es de numérica tipo y el otro es convertible (§5.1.8) a tipo numérico, la promoción numérica binaria se realiza en los operandos (§5.6.2).

corresponding paragraph in jls

Así que en realidad cualquiera de los operandos pueden ser de tipo numérico para Java para autounbox el otro.

Y luego, el §5.1.8 dice que las conversiones incluyen la conversión de unboxing.corresponing paragraph in jls

1

según las especificaciones, http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

¿Cuándo se debe utilizar autoboxing y unboxing? Úselos solo cuando haya una "falta de coincidencia de impedancia" entre los tipos de referencia y las primitivas, por ejemplo, cuando tenga que poner valores numéricos en una colección. No es apropiado usar autoboxing y unboxing para computación científica u otro código numérico sensible al rendimiento. Un entero no es un sustituto de un int; el autoboxing y unboxing borran la distinción entre tipos primitivos y tipos de referencia, pero no lo eliminan.

Los únicos casos aconsejable el uso de las clases de envoltura (Integer, etc.) son cuando usted quiere meter valores numéricos en una colección, o null es un valor aceptable para sus casos de uso. Eso es.

Los efectos secundarios incluyen potencial no deseado NullPointerException y disminución en el rendimiento.

Cuestiones relacionadas