Cytowany tekst to:
„Poleganie na takich wartościach domyślnych jest jednak ogólnie uważane za zły styl programowania”.
Cynicznie: „powszechnie uważa się, że” często mówi, że autor nie próbował znaleźć wiarygodnego źródła prezentowanej wypowiedzi.
W takim przypadku twierdzenie jest wyraźnie wątpliwe. Dowody: 5 z 5 wybranych przewodników stylu Java NIE mówi nic o tym, czy powinieneś lub powinieneś polegać na wartościach domyślnych:
(Uwaga: moja metodologia próbkowania polegała na przejrzeniu pierwszych 5 różnych wyników wyszukiwania Google pod kątem „przewodnika po stylu Java”. Następnie przeszukałem każdy dokument pod kątem „domyślnego”. Nie jest to dogłębna analiza, ale służy to mojej racji. )
OK. Czy to naprawdę poprawia czytelność kodu Java?
To jest dyskusyjne.
Z jednej strony początkujący programista Java, który nie dowiedział się o domyślnej inicjalizacji, może być zaskoczony tym, skąd pochodzą zera lub zera. Ale jeśli zawracają sobie głowę szukaniem wyraźnej inicjalizacji i stwierdzeniem, że jej nie ma, powinno to wystarczyć, aby przeczytali samouczek lub książkę, aby dowiedzieć się o domyślnej inicjalizacji. (Miałbyś nadzieję!)
Z drugiej strony zwykle nie oczekujemy, że początkujący programiści Java utrzymają produkcyjne bazy kodu. Dla doświadczonego programisty Java nadmiarowa inicjalizacja nie poprawia czytelności. Jest to (w najlepszym wypadku) hałas.
Moim zdaniem jedyne, co można osiągnąć dzięki redundantnej inicjalizacji pola, to zasygnalizowanie przyszłemu czytelnikowi twojego kodu, że pomyślałeś o wartości początkowej. (Jak wyraził to @GhostCat, domyślna inicjalizacja nie komunikuje zamiaru.)
Ale odwrotnie, gdybym był tym czytelnikiem, niekoniecznie ufałbym myśleniu autora kodu. Zatem wartość tego „sygnału” również jest wątpliwa.
Co z niezawodnością?
W Javie nie robi to różnicy. JLS określa, że domyślne inicjalizacji ma nastąpić na polach. I odwrotnie, w przypadku zmiennych lokalnych błędem kompilacji jest próba użycia zmiennej, która nie została zdecydowanie zainicjowana.
Krótko mówiąc, zachowanie środowiska wykonawczego zmiennej, która nie została jawnie zainicjowana, jest całkowicie przewidywalne.
W przeciwieństwie do języków takich jak C lub C ++, w których zmiennych nie można zainicjować, zachowanie jest nieokreślone i może prowadzić do awarii i różnic w zachowaniu na różnych platformach. Argument dotyczący zawsze jawnej inicjalizacji zmiennych jest tutaj znacznie silniejszy.
Co z wydajnością?
To nie powinno mieć znaczenia. Kompilator JIT powinien być w stanie traktować nadmiarową inicjalizację i domyślną inicjalizację tak samo.
private int count = 0;
jest kodem, który nic nie robi, a kodem, który nic nie robi, jest bałagan. To jak importowanie klas z java.lang lub deklarowanie klasy za pomocąextends Object
.