2013-12-11 6 views
1

Давайте предположим, что у меня есть класс:Java Autoboxing через метод

class A { 
    private Integer i; 

    public int getI() { 
    return i; 
    } 

    // Setter, etc. 
} 

и я пишу:

A a = // initializer 

Integer b = a.getI(); 

сколько Целые там будет? Мое наивное чтение о Autoboxing/распаковке заставляет меня верить, что ответ 2, но если Geti() был:

public Integer getI(); 

, то ответ будет 1.

ответ

3

Вы абсолютно правы, с одной оговоркой: ответ на первую часть зависит от значения Integer i.

  • В первом сценарии, один Integer создаются в конструкторе, а другой один создаются, когда бокс int приходит из getI()
  • Во втором сценарии, там должно быть не боксом, так что есть только один Integer объект.

Примечание: если значение Integer i мал (точнее, от -128 до 127, включительно), Autoboxing будет производить один и тот же Integer через interning.

+0

Ах, интернинг тоже! Небольшое наблюдение: безопасно ли использовать первый стиль? Если я использую второй стиль и позже сделаю другое назначение для b, будет ли a.i оставаться тем же или обновляться? – joeblubaugh

+0

@ joeblubaugh Оба способа безопасны: 'java.lang.Integer' * неизменный *, поэтому он не может быть обновлен« за вашей спиной ». – dasblinkenlight

1

Правильно .... МОГЛО

Теоретически возможно, что компилятор/JIT/JVM/etc может оптимизировать автобоксинг, но я понятия не имею, действительно ли это произойдет.

Также возможно повторное использование одного и того же объекта Integer. Например, Integer.valueOf (2) гарантированно дает вам тот же объект Integer каждый раз, когда вы его вызываете, и повторно используете тот же объект. Это гарантируется только для значений в диапазоне от -128 до +127 включительно, хотя это может произойти вне этого диапазона, но на него нельзя положиться.

+1

Фактически он * * гарантирован между -128 и 127 включительно. См. Ближе к концу http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7 –

+0

Компилятор Java не делает такую ​​оптимизацию, потому что это будет воспользуйтесь преимуществами JIT. –

+0

Да, по компилятору я имел в виду компиляцию Just In Time, может быть, яснее. @ Jon, что приятно знать - я знал, что обычный случай не знал, что это необходимо. –

Смежные вопросы