2014-04-27 69 views
6

Jestem nie chce wyłączyć lub zignorować ostrzeżenie, jak w The expression of type x is boxed into X?.Jaki jest odpowiedni sposób postępowania z ostrzeżeniem: "Wyrażenie typu x jest w ramce x"

Chciałbym wiedzieć, jaki jest prawidłowy sposób obsługi/uniknięcia tego ostrzeżenia, jeśli ktoś był tak skłonny.

+0

Zgadzam się z Jeffreyem na temat "wyłączyć ostrzeżenie". Eclipse wyświetla to ostrzeżenie w sekcji "Potencjalne problemy z programowaniem", zgodnie z dołączonym linkiem; ale nie widzę tego jako źródła problemów. – ajb

Odpowiedz

8

Boksowanie i rozpakowywanie to operacje, które możesz wykonać ręcznie, ale są one wbudowane w język, aby uniknąć powtórzeń, z którymi niewątpliwie napotkasz.

Integer obj = Integer.valueOf(5); // instead of Integer obj = 5; 
int i = obj.intValue(); // instead of int i = obj; 

Moim zdaniem, odpowiednim sposobem na potraktowanie tego ostrzeżenia, aby go wyłączyć. Ale jeśli to nie jest opcja, możesz zrobić powyższe.

+1

Ręczne rozpakowywanie ma jednak jedną zaletę: jawne dereferencje potencjalnie pustego wskaźnika. – KeatsPeeks

+0

@Keats Nie ma dużej przewagi. Tak czy inaczej, jeśli 'obj' ma wartość' null', otrzymasz 'NullPointerException'. Sądzę, że w tym przypadku jest bardziej oczywiste, skąd pochodzi. – Jeffrey

+1

@Jeffery Chodzi mi o to, że dzięki automatycznemu rozpakowywaniu możesz zapomnieć o możliwym NPE, a zrobienie tego ręcznie zmusza do myślenia o tym. Taki jest cel ostrzeżenia OP: wciąż zmusza do myślenia o NPE, nawet jeśli używasz automatycznego rozpakowywania. – KeatsPeeks

3

Moim zdaniem lepiej jest jawnie rozebrać wartości, ponieważ kod jest bardziej czytelny. Również mogą występować subtelne różnice, gdy stosujemy różne podejścia do boksu. Na przykład:

Integer i = new Integer (1);

Integer j = Integer.valueOf (1);

Zgodnie z javadoc Integer.valueOf() buforuje obiekty, więc i == j zwróci false.

także w inny sposób bezpośrednio do skrzynki pierwotna całkowita jest

całkowita K = (całkowita) 1; ale to faktycznie wywołuje Integer.valueOf().

+0

@bn. Zgadzam się z tą odpowiedzią, moim zdaniem lepiej jest jawnie box-unbox. Oprócz tego, że kod jest bardziej przejrzysty, zapewnia on, że nigdy nie napotkasz problemów takich jak te wymienione w odnośniku w [tej odpowiedzi] (http://stackoverflow.com/a/19512862/2814308). To, czy prawdopodobieństwo wystąpienia tych problemów jest niewielkie, czy też nie, nie jest dla mnie zbyt ważne, ponieważ cena, jaką trzeba zapłacić, aby uzyskać tę pewność (wyraźnie boksowanie - rozpakowywanie) jest wyjątkowo niska. – SantiBailors