Як виправдати міграцію з Java 6 на Java 7?


28

Ми переходили з Java 6 на Java 7 . Проект не відповідає графіку, і ризики будуть відхилені, і в цьому випадку він продовжить використовувати Java 6.

Які конкретні вдосконалення Java 7, з якими ми могли б повернутися до нашого менеджера та переконати його у важливості використання JDK 7? Шукаю виправлення помилок, які я міг би виділити в Oracle Java 7 (стосовно Java 6). Виправлення в безпеці, продуктивності, Java 2D / друку тощо будуть в моєму випадку більш продажними. Наприклад, виправлення компілятора не принесуть великої користі.

[Я переглядаю багато сайтів, таких як посібник із прийняття Oracle , база помилок, питання щодо переповнення стека].

Оновлення: Дякую за відповіді. Ми перенесли оновлення до наступного випуску. Найближчим у нас була безпека. Прийняття найвищої відповіді.


5
Ти щасливчик. Судячи з питань, які все ще регулярно з'являються на Stack Overflow , деякі люди все ще застрягли з Java 1.4 (платформою, якій 11 років!).
Йоахім Зауер

3
Чому ви робите оновлення зараз, якщо ви ще не знаєте про деякі функції в 7, які вам потрібні? Можливо, ви витрачаєте свій час і повинні подумати трохи більше про те, чи варто виправдовувати це, а не як ви повинні це виправдати.
Брайан Оуклі

1
Це тільки я чи заголовок назад?
Radu Murzea

1
Питання більш важливе: чому вам важко модернізувати? Мені вдалося модернізувати мільйонний локальний проект за тиждень до Java 7. Я думаю, що відповідь на ваші проблеми - це аналіз того, чому ви так важко робите оновлення.
Ендрю Т Фіннелл

2
@ Ендрю Фіннелл: Вибачте. Я не вважав, що це так актуально. Фактичне перенесення було завершено менше ніж за тиждень. В основному завдяки власним api, які ми використовували. Код, на який впливає сумісність, залежав від функції, ніж фактична кількість рядків коду (приблизно 4 мільйони). Затримка була викликана різними факторами, такими як підтримка інструментів - наприклад, покриття коду за допомогою cobertura 2.0. просто стабілізується. Іншим інструментом був Rational Functional Tester, який потребував оновлення (ми вирішили не робити). Можливо, я напишу записку про загальні фактори, що вплинули на зусилля ..
Jayan

Відповіді:


44

Java 6 досягла EOL в лютому цього року і більше не отримуватиме публічні оновлення (включаючи безпеку), якщо ви не придбаєте дуже дорогу корпоративну підтримку.

У цьому повинна бути вся необхідна причина.

Крім того, великі докази свідчать про те, що зворотна сумісність для виконання Java є чудовою. Цілком ймовірно, що вам доведеться просто замінити установки Java 6 на Java 7, і всі програми просто продовжуватимуть працювати без проблем. Звичайно, це не гарантується, і рекомендуються обширні тести, щоб підтвердити, що проблем справді не буде.


2
це має бути прийнятою відповіддю. Міркування, засновані на датах EOL, виявились найкращим чином для мене, коли виникала необхідність обґрунтовувати конкретні оновлення продуктів, зокрема, зокрема, Java. Для повного обгрунтування я також додам примітку про відсталу бінарну сумісність (бажано, підкріплену якоюсь офіційною заявою Oracle) та примітку про необхідність тестувати оновлення оновлення (у випадку, наприклад, деяких несподіваних залежностей від твердо кодованих посилань на версію " 6 "у налаштуваннях додатків)
gnat

1
це в основному єдина причина, по якій більшість компаній модернізують.
jwenting

Майкл, чи має сенс додати у свою відповідь замітки, які я згадав ( роз'яснення щодо сумісності та тестування на дим )? заради повноти, так би мовити
гнат

1
@gnat: зроблено, хоча я сумніваюся, що людям, які проти міграції, потрібно розповісти про необхідність тестування, а також більше, ніж просто димові тести. Там, безумовно , іноді є серйозні несумісності.
Майкл Боргвардт

@MichaelBorgwardt добре, розповідаючи про це дещо хитра річ, і вона має більше стосунку бути переконливою, а не технічно правильною. Я для одного навчився досить важкого способу викладати такі речі чітко і чітко, коли є хлопці "перед зміною". Цей вид надсилає їм сигнал, "ми слухаємо і ділимося вашими занепокоєннями, і ми теж переживаємо", змушує їх відчувати ціну (на відміну від ігнорованих) ... і врешті-решт призводить до легшого схвалення змін :)
gnat

29

Загалом, існує ряд досить широких змін, щоб полегшити роботу програміста. Ваш менеджер може не надто перейматися подібними речами, але змушуючи програмістів витрачати менше часу на роздуми про код котла, і, таким чином, мати більше часу на роздуми над реальною метою того, що вони реалізують, повинно підвищити ефективність, зменшити помилки тощо, що може бути дуже вагомим аргументом. У Oracle є досить обширний перелік змін , але він досить тривалий, тому я підсумую якнайбільше.

Мовні функції включають:

  • Менше котла на Generics. Код Map<String, String> myMap = new HashMap<String, String>();можна зменшити до Map<String, String> myMap = new HashMap<>(). Компілятор може зробити висновок про загальні типи, потрібні праворуч з лівого боку, тому ваш код стає трохи коротшим та швидшим для читання.
  • Струни зараз працюють в операторах переключення , використовуючи семантику .equals()методу замість ==.
  • Автоматичне управління ресурсами за допомогою пробних ресурсів. Це робить код чистішим, але також має перевагу перед старим стилем пробування / нарешті на основі коду. Якщо в операторі спробу буде викинуто виняток, а потім буде закрито інше під час закриття, код, який використовує традиційні операції try / нарешті, повністю втратить вихідний виняток і передасть лише той, який був кинутий у остаточному блоці. У заяві "спробу використання ресурсів" час виконання буде придушувати виняток, який виклики close () викинув, і передати оригінальний виняток у стек, припускаючи, що цей оригінальний виняток є тим, що викликав усі проблеми в першій місце. Крім того, замість того, щоб залишити інший виняток зі сміттєзбірника, це придушення дозволяє витягнути близькі винятки за допомогою Throwable.getSuppressed.
  • Числові літерали можна полегшити для читання. Усі цифрові літерали дозволяють підкреслити , тому такі речі int n = 1000000000можна зробити набагато читабельнішими int n = 1_000_000_000, що набагато простіше розібратися як один мільярд, і складніше неправильно вводити, не помічаючи. Також бінарні літерали дозволені у формі 0b10110101, що робить код, який працює з бітовими полями, трохи приємніше читати.
  • Обробка декількох типів винятків у одній і тій самій заяві вилову може бути виконана, зменшуючи дублюючи код і потенційно полегшуючи рефакторинг пізніше.

Кожна з цих змін - це те, про що ваш менеджер може не піклуватися безпосередньо, але вони полегшують написання правильного коду без особливих зусиль і думок, звільняючи розум трохи більше зосередитися на фактичній логіці, яку ви намагаєтеся для реалізації, а також вони трохи спрощують читання коду пізніше, роблячи налагодження трохи швидшим.

Що стосується API, також відбулось ряд оновлень API:

  • З точки зору безпеки , кілька методів шифрування додано / застаріло, оскільки криптовалюта рухається вперед.
  • Файл IO було змінено ( це може бути кращим посиланням ), додавши кращу абстракцію в ряді місць. Я особисто не занурювався в нові речі вводу-виводу, але це виглядає як дуже корисний капітальний ремонт, що значно полегшує роботу з файловою системою без особливого болю.
  • Підтримка Unicode - це Unicode 6.0, а також ряд інших удосконалень інтернаціоналізації.
  • Java2D , про який ви згадували у своєму запитанні, було вдосконалено. Краща підтримка шрифту Linux, краща візуалізація X11 на сучасних машинах та обробка тибетських сценаріїв.

1
Nit pick: насправді перемикач рядків працює "так, ніби він використовує String.equalsметод" (з документа, до якого ви зв'язали). Насправді компілятор вільний оптимізувати, щоб String.equalsйого не використовувати ... за умови, що чистий ефект однаковий. (І я би сподівався, що він буде використовувати String.hashcodeпонад певну кількість випадків комутації.)
Стівен C

Правда досить. Більшість компіляторів можуть зробити тонну оптимізацій , які не змінюють семантику , хоча, так що це часто зайвим відзначити такі дрібниці , як це; Я лише конкретно згадував .equals (), щоб явно сказати, що випадок не ігнорується. Тим не менш, я трохи оновив формулювання.
Біллі Мельдман

Строкові комутатори не рекомендується застосовувати, оскільки ви перемикаєте на незв'язаний домен. Увімкнення Enums є типовим середнім майданчиком, тому що ви можете мати рядок як представлення, але з семантичним значенням. Ох і +1 для повної відповіді BTW.
Martijn Verburg

Які переваги використання рядків у операторі переключення замість цілих констант?
Джорджіо

3
Єдиною причиною бізнесу серед них можуть бути покращення безпеки. Технічні приналежності є як дискусійними, так і вкрай неактуальними для ділових людей.
jwenting

8

try-with-ресурси - це функція, яку варто оновити до Java 7, і все самостійно. Витоки ресурсів / витоки пам’яті є великим ризиком розвитку Java, і TWR значно зменшує цей ризик.

Я додам, що нові абстракції файлів NIO.2 та асинхронні можливості також варто перейти, якщо у вашій програмі є функції вводу / виводу файлів / мереж.


Вони також зменшують необхідну кількість PermGen і використовують замість цього Heap або рідну пам’ять, я не впевнений, де він буде зберігатися зараз. Це означає, що для Java 8 вам не потрібно буде встановлювати два максимальних параметра пам'яті.
Ендрю Т Фіннелл

Чи не тест-ресурси не те саме, що спробувати, але з меншою кількістю котлів?
jhewlett

1
Я думаю, що ідея полягає в тому, що менше котлових плит означає, що легше вийти правильно.
MatrixFrog

1
Менша плита котла і правильні мазі для закриття. Вони виявили, що всередині OpenJDK вони робили це вручну неправильно приблизно в 2/3 часу .... Я підозрюю, що інші високі відсотки цього в інших корпусах коду.
Martijn Verburg

6

Можливо, є причина, чому ви не повинні переходити на Java 7: Якщо вам доведеться використовувати VM Oracle і ваше програмне забезпечення працює або на вбудованому апаратному забезпеченні, або ви будете поширювати його з вбудованим обладнанням: Oracle змінив ліцензію JRE, щоб не ліцензувати, якщо вище умови дотримані; вам потрібно придбати вбудовану ліцензію Java SE. Дивіться, що означає "система загального призначення" для вбудованої Java SE?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.