Jak uzasadnić migrację z Java 6 do Java 7?

28

Przeprowadziliśmy migrację z Java 6 do Java 7 . Projekt jest opóźniony i istnieje ryzyko, że zostanie porzucony, w takim przypadku będzie nadal korzystać z Java 6.

Jakie są szczególne ulepszenia w Javie 7, z którymi moglibyśmy wrócić do naszego menedżera i przekonać go, że ważne jest używanie JDK 7? Poszukuję poprawek błędów, które mógłbym wyróżnić w Oracle Java 7 (w odniesieniu do Java 6). Poprawki bezpieczeństwa, wydajności, Java 2D / drukowania itp. Będą w moim przypadku łatwiejsze do sprzedania. Na przykład poprawki kompilatora nie będą zbyt przydatne.

[Przeglądam wiele stron, takich jak przewodnik adopcji Oracle , baza błędów, pytania dotyczące przepełnienia stosu].

Aktualizacja: Dziękujemy za odpowiedzi. Zmieniliśmy harmonogram aktualizacji na następną wersję. Najbliższe było bezpieczeństwo. Akceptuj najwyższą głosowaną odpowiedź.

Jayan
źródło
5
Jesteś szczęściarzem. Sądząc z pytań, które wciąż pojawiają się regularnie na Stack Overflow , niektórzy ludzie wciąż tkwią w Javie 1.4 (platforma, która ma 11 lat!).
Joachim Sauer
3
Dlaczego teraz przeprowadzasz aktualizację, jeśli nie znasz jeszcze niektórych funkcji 7, których potrzebujesz? Być może marnujesz czas i powinieneś pomyśleć o tym, czy powinieneś to uzasadnić, a nie o tym , jak powinieneś to uzasadnić.
Bryan Oakley,
1
Czy to tylko ja, czy tytuł jest odwrócony?
Radu Murzea,
1
Większe pytanie brzmi: dlaczego tak trudno jest ci dokonać aktualizacji? Udało mi się uaktualnić milion projektów Loc w ciągu tygodnia do Java 7. Myślę, że odpowiedzią na wasze problemy jest przeanalizowanie, dlaczego tak trudno jest przeprowadzić aktualizację.
Andrew T Finnell,
2
@ Andrew Finnell: Przepraszam. Nie sądziłem, że to było tak istotne. Właściwe przeniesienie zostało zakończone w niecały tydzień. Głównie ze względu na własnościowe api firmy Sun, których używaliśmy. Był to kod wpływający na kompatybilność specyficzną dla funkcji niż faktyczna liczba wierszy kodu (około 4 miliony). Opóźnienie spowodowane było różnymi czynnikami, takimi jak obsługa narzędzi - na przykład pokrycie kodu za pomocą cobertura 2.0. po prostu się stabilizuje. Kolejnym narzędziem był produkt Rational Functional Tester, który wymagał aktualizacji (postanowiliśmy tego nie robić). Być może napiszę notatkę na temat ogólnych czynników wpływających na wysiłek.
Jayan

Odpowiedzi:

44

Java 6 osiągnęła EOL w lutym tego roku i nie będzie już otrzymywać publicznych aktualizacji (w tym zabezpieczeń), chyba że kupisz bardzo drogie wsparcie dla przedsiębiorstw.

To powinien być cały potrzebny powód.

Poza tym przytłaczające dowody sugerują, że zgodność wsteczna dla środowisk wykonawczych Java jest doskonała. Możliwe, że wystarczy zastąpić instalacje Java 6 Java 7, a wszystkie aplikacje będą działać bez żadnych problemów. Oczywiście nie jest to gwarantowane i zaleca się obszerne testy w celu potwierdzenia, że ​​rzeczywiście nie będzie żadnych problemów.

Michael Borgwardt
źródło
2
to powinna być zaakceptowana odpowiedź. Okazało się, że rozumowanie oparte na dacie EOL działa najlepiej, gdy zajdzie potrzeba uzasadnienia określonych aktualizacji produktu, w szczególności Java. W celu uzupełnienia uzasadnienia dodam również uwagę na temat zgodności binarnej wstecznej (najlepiej kopii zapasowej z jakimś oficjalnym oświadczeniem Oracle) oraz uwagę na temat potrzeby przetestowania aktualizacji przez dym (w przypadku np. Niektórych nieoczekiwanych zależności od zakodowanych odniesień do wersji „ 6 "w konfiguracjach aplikacji)
zgrywaj
1
jest to w zasadzie jedyny powód, dla którego większość firm dokonuje aktualizacji.
jwenting
Michael, czy miałoby sens dodawanie notatek, które wspomniałem ( wyjaśnienia dotyczące zgodności i testów dymu ) do swojej odpowiedzi? ze względu na kompletność, że tak powiem
komnata
1
@gnat: gotowe, choć wątpię, aby ludzie, którzy są przeciwni migracji, powinni zostać poinformowani o potrzebie przeprowadzenia testów, a nie tylko testów dymu. Zdecydowanie występują czasem poważne niezgodności.
Michael Borgwardt,
@MichaelBorgwardt dobrze, mówienie o tym jest nieco trudną rzeczą i ma więcej wspólnego z byciem przekonującym niż technicznie poprawnym. Na przykład nauczyłem się dość trudnego sposobu wyrażania takich rzeczy w sposób wyraźny i wyraźny, gdy są ludzie „przywracający zmianę”. Ten rodzaj wysyła im sygnał: „słuchamy i dzielimy się twoimi obawami, a także się martwimy”, sprawia, że ​​czują się doceniani (w przeciwieństwie do ignorowanych) ... i ostatecznie prowadzą do łatwiejszego zatwierdzenia zmiany :)
gnat
29

Ogólnie rzecz biorąc, istnieje wiele dość szerokich zmian, aby ułatwić programistom. Twój menedżer może nie przejmować się zbytnio takimi rzeczami, ale sprawienie, aby programiści spędzili mniej czasu na myśleniu o kodzie typu „kocioł”, a tym samym mieli więcej czasu na zastanowienie się nad faktycznym celem tego, co wdrażają, powinien zwiększyć wydajność, zmniejszyć błędy itp., co może być bardzo silnym argumentem. Oracle ma dość obszerną listę zmian , ale jest dość długa, więc podsumuję jak najwięcej.

Funkcje językowe obejmują:

  • Mniej bojlerów w Generics. Kod Map<String, String> myMap = new HashMap<String, String>();można zredukować do Map<String, String> myMap = new HashMap<>(). Kompilator może wnioskować o typach ogólnych potrzebnych po prawej stronie od lewej, więc twój kod jest nieco krótszy i szybszy do odczytania.
  • Ciągi działają teraz w instrukcjach switch , używając semantyki .equals()metody zamiast ==.
  • Automatyczne zarządzanie zasobami przy użyciu try-with-resources. To sprawia, że ​​kod jest czystszy, ale ma także przewagę nad kodem try / last-based w starym stylu. Jeśli wyjątek zostanie zgłoszony w instrukcji try, a następnie inny zostanie zgłoszony podczas zamykania, kod, który używa tradycyjnych instrukcji try / last, całkowicie straci oryginalny wyjątek i przekaże tylko ten, który został zgłoszony w bloku ostatecznie. W instrukcji try-with-resources środowisko wykonawcze ukryje wyjątek zgłoszony przez funkcję close () i przeniesie oryginalny wyjątek do góry stosu, przy założeniu, że ten oryginalny wyjątek spowodował wszystkie problemy w pierwszym miejsce. Dodatkowo, zamiast porzucić drugi wyjątek do modułu wyrzucania elementów bezużytecznych, to pomijanie pozwala na uzyskanie ściśle określonych wyjątków przy użyciu Throwable.getSuppressed.
  • Literały liczbowe mogą być łatwiejsze do odczytania. Wszystkie literały liczbowe pozwalają na podkreślenia , dzięki czemu rzeczy takie int n = 1000000000można przekształcić w znacznie bardziej czytelne int n = 1_000_000_000, co znacznie łatwiej jest analizować jako miliard, a trudniej wpisać niepoprawnie bez zauważenia. Również binarne literały są dozwolone w formie 0b10110101, dzięki czemu kod, który działa z polami bitowymi, jest nieco łatwiejszy do odczytania.
  • Można obsługiwać wiele typów wyjątków w ramach tej samej instrukcji catch , co ogranicza duplikowanie kodu i potencjalnie ułatwia późniejszą refaktoryzację.

Każda z tych zmian jest czymś, na czym twój menedżer może nie obchodzić bezpośrednio, ale ułatwiają one pisanie poprawnego kodu bez większego wysiłku i przemyśleń, uwalniając umysł od skupienia się na logice, której próbujesz. do implementacji, a także ułatwiają późniejsze czytanie kodu, dzięki czemu debugowanie jest trochę szybsze.

Po stronie interfejsu API wystąpiły również liczne aktualizacje interfejsu API:

  • Ze względów bezpieczeństwa dodano / wycofano kilka metod szyfrowania, ponieważ szyfrowanie przesuwa się do przodu.
  • Plik IO został zmieniony ( może to być lepszy link ), dodając pewną lepszą abstrakcję w wielu miejscach. Osobiście nie zagłębiłem się w nowe rzeczy związane z IO, ale wygląda to na bardzo przydatny przegląd, który znacznie ułatwia pracę z systemem plików bez większego bólu.
  • Obsługa Unicode jest do Unicode 6.0, a także szereg innych ulepszeń internacjonalizacji.
  • Java2D , o którym wspomniałeś w swoim pytaniu, zostało ulepszone. Lepsza obsługa czcionek w systemie Linux, lepsze renderowanie X11 na nowoczesnych maszynach oraz obsługa skryptów tybetańskich.
Billy Mailman
źródło
1
Wybór nitów: w rzeczywistości przełącznik ciągów działa „tak, jakby używał String.equalsmetody” (z dokumentu, do którego się łączysz). W rzeczywistości kompilator może dowolnie optymalizować, aby String.equalsnie był używany ... pod warunkiem, że efekt netto jest taki sam. (I spodziewałbym się, że użyje go String.hashcodepowyżej pewnej liczby przypadków przełączników.)
Stephen C
Prawda prawda Większość kompilatorów może dokonywać mnóstwa optymalizacji, które nie zmieniają semantyki, więc często zbyteczne jest wskazywanie takich drobiazgów; Wspomniałem tylko .equals (), aby wyraźnie powiedzieć, że wielkość liter nie jest ignorowana. Niemniej jednak trochę zaktualizowałem brzmienie.
Billy Mailman
Przełączniki łańcuchowe nie są zalecane, ponieważ przełączasz się na domenę niezwiązaną. Włączanie Enums jest tutaj typowym środkiem, ponieważ możesz mieć reprezentację typu String, ale o znaczeniu semantycznym. Aha i +1 za pełną odpowiedź BTW.
Martijn Verburg
Jakie są zalety używania ciągów w instrukcji switch zamiast stałych całkowitych?
Giorgio
3
jedynym z powodów biznesowych mogą być ulepszenia bezpieczeństwa. Techniczne subtelności są zarówno dyskusyjne, jak i zupełnie nieistotne dla ludzi biznesu.
jwenting
8

try-with-resources to funkcja, którą warto zaktualizować do wersji Java 7 dla samego siebie. Wycieki zasobów / wycieki pamięci stanowią duże ryzyko w rozwoju Java, a TWR znacznie je zmniejsza.

Dodam, że nowa abstrakcja pliku NIO.2 i funkcje asynchroniczne również są warte przejścia, jeśli twoja aplikacja ma funkcje we / wy plików / sieci.

Martijn Verburg
źródło
Zmniejszają również ilość potrzebnego PermGen i zamiast tego używają Sterty lub pamięci natywnej, nie jestem pewien, gdzie będzie teraz przechowywany. Oznacza to, że w Javie 8 nie trzeba ustawiać dwóch parametrów maksymalnej pamięci.
Andrew T Finnell,
Czy wypróbowanie z zasobami nie jest tym samym, co wypróbowanie na koniec, ale z mniejszą liczbą elementów?
jhewlett
1
Myślę, że chodzi o to, że mniej płyt kotłowych oznacza, że ​​łatwiej jest się dobrze postarać.
MatrixFrog,
1
Mniej płyty kotła i poprawne środki zamykające. Odkryli, że w OpenJDK robili to źle ręcznie przez 2/3 czasu ... Podejrzewam, że inne wysokie odsetki tego w innych korpusach kodu.
Martijn Verburg
6

Może istnieć powód, dla którego nie powinieneś przestawiać się na Javę 7: Jeśli musisz użyć maszyny wirtualnej Oracle, a twoje oprogramowanie albo działa na wbudowanym sprzęcie, albo będziesz go dystrybuować ze sprzętem wbudowanym: Oracle zmieniło licencję JRE, aby nie była licencjonowana, jeśli powyżej warunki są spełnione; musisz kupić licencję wbudowaną Java SE. Zobacz Co oznacza „system ogólnego zastosowania” dla Java SE Embedded?

Przywróć Monikę - M. Schröder
źródło