Krótko mówiąc,
- Linia
Integer in = (Integer)y;
wykorzystuje niepotrzebnego obsady.
- Linia
Integer in = new Integer(y);
tworzy instancję Integer
.
Każdy przypadek szczegółowo
Po pierwsze, rozważmy sprawę z wyraźną odlewu.
Integer i = (Integer)10;
Kompilator rozumie, że 10
jest int
prymitywny typ i fakt, że to musi być opakowane przez jego Integer
aby kompiluje. Wydaje javac uczyni, co następuje:
Integer i = (Integer)Integer.valueOf(10);
Ale kompilator jest wystarczająco inteligentny, aby zrobić niepotrzebnego casting, (Integer)
tylko zostaną pominięte:
Integer i = Integer.valueOf(10);
Następny istnieje w przypadku tworzenia instancji.
Integer i = new Integer(10);
Tutaj wszystko jest po prostu. Nowa instancja klasy Integer
zostanie utworzona. Ale, jak wynika z dokumentacji, zwykle nie jest to właściwy sposób:
Rzadko należy używać tych konstruktorów. Statyczne fabryki valueOf()
są generalnie lepszym wyborem, ponieważ zapewnią znacznie lepszą wydajność w czasie i przestrzeni.
Wnioski
W codziennego pisania kodu, zazwyczaj używamy autoboxing and unboxing. Są to automatyczne konwersje między typami pierwotnymi i odpowiadającymi im klasami pakowania obiektów (wprowadzone w języku Java 5). Więc nie musisz dużo myśleć o metodach Xxx.valueOf(xxx)
i .xxxValue()
. To takie wygodne, prawda?
Integer i = 10; // autoboxing
int j = i; // unboxing
Do tego konwersji należy użyć 'Integer.valueOf()'. Z poziomu javadoc: "Jeśli nowa instancja Integer nie jest wymagana, ta metoda powinna być generalnie używana w stosunku do konstruktora Integer (int), ponieważ metoda ta prawdopodobnie przyniesie znacznie lepszą wydajność w przestrzeni i czasie poprzez buforowanie często żądanej wartości" – Jens