2009-04-20 16 views

Odpowiedz

16

Uprościliście trochę za bardzo.

Autoboxing również wchodzi w grę podczas korzystania z kolekcji. Jak wyjaśniono w dokumentacji Java java:

Kolekcje mogą zawierać tylko odniesienia do obiektów, więc musisz wprowadzić wartości pierwotne do odpowiedniej klasy opakowania. ... Po usunięciu obiektu z kolekcji otrzymasz liczbę całkowitą, którą wstawisz; jeśli potrzebujesz int, musisz rozpakować Integer za pomocą metody intValue. Całe to boksowanie i rozpakowywanie jest uciążliwe i podkręca twój kod. Funkcja autoboxing i unboxing automatyzuje proces, eliminując ból i bałagan.

Więc kiedy powinieneś używać autoboxing i unboxing? Używaj ich tylko wtedy, gdy występuje "niedopasowanie impedancji" pomiędzy typami odniesienia i prymitywami, na przykład, gdy musisz umieścić wartości liczbowe w kolekcji. Nie jest właściwe stosowanie autoboxingu i rozpakowywania w przypadku obliczeń naukowych lub innych kodów numerycznych wrażliwych na wydajność. Liczba całkowita nie jest substytutem int; autoboxing i unboxing zamazują rozróżnienie między typami pierwotnymi i referencyjnymi, ale nie eliminują go.

Great overview of Autoboxing

1

Sprawia, że ​​kod jest bardziej czytelny i czytelniejszy. Zwłaszcza jeśli robisz operacje (ponieważ Java nie ma przeciążenia operatora).

1

Z moim cyniczny kapelusz na: do make-up dla ograniczeń oryginalnego Java (mam na myśli Oak tutaj) spec. Nie tylko za pierwszym razem.

+1

Jakie ograniczenia? –

+4

Od czego zacząć? The Time-Date API, brak API kolekcji od samego początku, tablice są "lekkie" Obiekty i nie nadpisują Object.equals(), brak generycznych od samego początku, "dziwny" mechanizm klonowania ... W końcu znajdź subtelne skrzypienie w języku, lub odczytaj je i jak zostały załatane. Pod koniec dnia, Java była odrodzonym językiem osadzonym dla boomu dot-com, i to pokazuje. Wolę C#, mimo że jest Microsoft. –

3

To jest pomysł, tak. Jednak wygodniej jest przypisać Integer do int.

Można argumentować, że autoboxing odnosi się raczej do symptomu niż przyczyny. Prawdziwym źródłem nieporozumień jest to, że system typu Java jest niespójny: potrzeba zarówno prymitywów, jak i odniesień do obiektów jest sztuczna i niezręczna. Autoboxing łagodzi to nieco.

+0

Co jest niezręcznego w posiadaniu prymitywów? Masz na myśli, że niszczy to czysto obiektową naturę języka? W Ruby na przykład nawet liczby całkowite są obiektami. Czy o to Ci chodziło? –

+0

Naprawdę nie rozumiem, dlaczego to taka wielka sprawa. Myślę, że powinni byli zostawić wystarczająco dużo w spokoju. Wydaje się, że nie dodaje to zbyt wiele z tego, co mogę powiedzieć do tej pory. Oczywiście, dowiedziałem się o tej funkcji około pięć minut temu. –

+0

Tak, właśnie o to mi chodzi. Nie jestem purystą z dystansu, ale nie jest oczywiste, dlaczego programista ma do swojej dyspozycji zarówno int, jak i Integer. Myślę, że jedna abstrakcja powinna wystarczyć, by objąć "integer-ness". – jcrossley3

1

Z tego, co pamiętam z czytania Efektywnej Jawy Joshua Blocha, powinieneś rozważyć prymitywy nad ich odpowiednikami w pudełkach. Autoboxing bez względu na skutki uboczne może powodować problemy.

+0

Co masz na myśli? –

+0

Ponieważ prymitywy są zawsze kopiowane, gdy są przekazywane. Nie wierzę, że tak jest w przypadku ich pudełkowych odpowiedników. – CookieOfFortune

1

Dodając do komentarza Lim, prymitywy są przechowywane na stosie, a prymitywne opakowania, jako obiekty, są przechowywane na stercie ... Z tego powodu są subtelne implikacje.

1

Główną zaletą jest przede wszystkim czytelność, cukier syntaktyczny. Java jest już bardzo obszerna, Sun próbuje zastosować różne sposoby, aby skrócić składnię.

7

BTW

Integer i = 0; 

jest równoważna

Integer i = Integer.valueOf(0); 

Różnica jest taka, że ​​valueOf() nie tworzy nowy obiekt o wartości między -128 i 127 (podobno to będzie tunable jeśli Java 6u14)

+0

Dziękujemy! Był bardzo zdezorientowany, dlaczego tylko czasami powstał nowy obiekt! – DustByte

+0

@DustByte, ponieważ może buforować tylko zwykłe obiekty. Buforowanie każdej Integer spowoduje użycie 40 GB pamięci (tylko dla Integer) –

5

ona istnieje, tak że można napisać kod jak

List<Integer> is = new ArrayList<Integer>(); 
is.add(1); // auto-boxing 
is.add(2); 
is.add(3); 

int sum = 0; 
for (int i : is) // auto-unboxing 
{ 
    sum += i; 
} 

Dla pojedynczych liczb całkowitych powinieneś domyślnie używać typu int, a nie Integer. Integer jest głównie do użytku w kolekcjach.

Należy pamiętać, że wartość Long różni się od tej samej wartości co liczba całkowita (za pomocą equals()), ale jako długość jest równa wartości int (za pomocą ==).