2010-01-09 15 views
9

Jestem wielkim fanem auto-boxing w Javie, ponieważ oszczędza wiele brzydkich kodów płyty kotła. Jednak odkryłem, że automatyczne rozpakowywanie jest mylące w pewnych okolicznościach, gdy obiekt Number może mieć wartość null. Czy istnieje sposób na wykrycie miejsca, w którym następuje automatyczne rozpakowywanie w bazie kodu z ostrzeżeniem javac? Każde inne rozwiązanie wykrywające przypadki rozpakowywania (takie jak FindBugs lub ostrzeżenie kompilatora specyficzne dla Eclipse) byłoby docenione, ponieważ nie mogę znaleźć żadnego rozwiązania.Automatyczne rozpakowywanie Java - czy jest ostrzeżenie kompilatora?

Aby wyjaśnić, nie chcę generować ostrzeżeń na boksie - tylko rozpakowywanie.

Oto prosty przykład z jakiegoś kodu, który może spowodować mylące NullPointerExceptions:

class Test { 
    private Integer value; 

    public int getValue() { 
     return value; 
    } 
} 

Odpowiedz

1

Eclipse pozwoli Ci wykonywać operacje boxbox i unboxing w kolorze składni (ale nie jeden lub drugi). Mam je ustawione na jasnoczerwony: jeśli tak się stanie, oznacza to, że byłem niechlujny w dopasowywaniu parametrów i argumentów.

+0

Dzięki - myślę, że zrobię to samo. Nawet jeśli nie złapie problemu, powinno ułatwiać debugowanie problemu. –

+2

Występuje problem związany z oddzieleniem boksu od rozpakowywania ostrzeżeń: https://bugs.eclipse.org/bugs/show_bug.cgi?id=163065 – Kyle

5

Tak. W Eclipse:

Preferencje-> Java-> Compiler-> Błędy/Warnings-> Programowanie Potencjał PROBLEMY> Boks i unboxing konwersje

+0

Przepraszam, że może powinienem być jaśniejszy (zmienię pytanie). Chcę ostrzeżenie o rozpakowaniu, ale nie o boksie. –

+0

Ah, żaden Eclipse nie pozwoli ci rozróżnić tych dwóch. – skaffman

+0

@skaffman Mam nadzieję, że: https://bugs.eclipse.org/bugs/show_bug.cgi?id=163065 zostanie zaimplementowany. – Kyle

2

Niestety nie ma. Jest to jeden z problemów z automatycznym rozpakowywaniem numerów.

  • można zainicjować do wartości domyślnych, takich jak private Integer value = 0
  • Sprawdź, czy wartość null return value != null ? value : 0

osobiście wolę pierwszą metodę. Ogólnie myślę, że nie miałbyś zbyt wielu przypadków, w których powinieneś mieć numer zerowy.

Ponadto, dlaczego używasz dużej Integer do przechowywania wartości. Jeśli zwracasz tylko trochę int, dlaczego nie zapisać go w ten sposób?

+0

Czasami obsługa interfejsu API/interfejsu wymaga zwracania int, podczas gdy długi/BigInteger byłby dostępny. Och, jak chciałbym mieć 'List' z wpisami' Long.MAX_VALUE', ale niestety nie mogę tego zrobić. – Esko

+0

Możesz mieć "List", który jest duży; po prostu nie może ci powiedzieć, że jest tak duża. Na przykład w 'LinkedList' zachowuje pole' size' typu 'int', ale nigdy nie sprawdza, czy rozmiar się nie przepełnił. Jednak niektóre operacje zakończą się niepowodzeniem, gdy upewnisz się, że bieżący indeks jest * mniejszy niż * rozmiar, który nie byłby zachowany, gdyby pole "size" zostało przepełnione do wartości ujemnej. – seh

+0

Nie mogę użyć 'List' z Long.MAX_VALUE elementów jako zamiennik w moim kodzie i właśnie tam jest to ważne. Bardzo dobrze znam semantykę 'AbstractList' i tym podobne, jednak dopóki interfejs mówi" int ", jestem do tego zobowiązany. – Esko

1

Wątpię, że będzie to ostrzeżenie. To jedna z dziwactw auto-boksowania.

Joshua Bloch zajmuje się tym w swojej książce "Effective Java". Zasadniczo kompilator stara się zrobić dla ciebie więcej, niż się spodziewamy. Innymi słowy, ten typ problemu jest częściej związany z używaniem iw rezultacie trudno jest "zauważyć błąd", ponieważ błąd jest, mówiąc semantycznie, po prostu nieobecny.

Powiązane problemy