Как оправдать переход с 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
Это только у меня так или звание задом наперед?
Раду Мурзеа
1
Главный вопрос: почему у вас такие сложные обновления? Мне удалось за неделю обновить проект на миллион loc до 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 "в конфигах приложения)
комарик
1
это в основном единственная причина, по которой большинство компаний будут обновляться.
jwenting
Майкл, есть ли смысл добавлять упомянутые мной заметки ( разъяснения по совместимости и тестированию дыма ) в свой ответ? для полноты так сказать
комнат
1
@gnat: сделано, хотя я сомневаюсь, что людям, которые выступают против миграции, нужно рассказать о необходимости тестирования, а не только о тестах на дым. Там, безусловно , иногда бывают серьезные несовместимости.
Майкл Боргвардт
@MichaelBorgwardt хорошо, рассказывать об этом довольно сложно, и это больше связано с тем, чтобы быть убедительным, а не технически правильным. Я, например, научился довольно сложному способу четко и ясно излагать подобные вещи, когда есть парни, «против перемен». Этот вид посылает им сигнал «мы выслушиваем и разделяем ваши опасения, и мы тоже беспокоимся», заставляет их чувствовать себя ценными (в отличие от игнорируемых) ... и в конечном итоге приводит к более легкому одобрению изменений :)
комнат
29

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

Языковые функции включают в себя:

  • Меньше шаблон на Generics. Код Map<String, String> myMap = new HashMap<String, String>();может быть уменьшен до Map<String, String> myMap = new HashMap<>(). Компилятор может вывести обобщенные типы, необходимые справа, слева, поэтому ваш код становится немного короче и быстрее для чтения.
  • Строки теперь работают в выражениях switch , используя семантику .equals()метода вместо ==.
  • Автоматическое управление ресурсами с использованием try-with-resources. Это делает код чище, но также имеет преимущество перед старым стилем кода на основе try / finally. Если в операторе try генерируется исключение, а при закрытии генерируется другое, код, использующий традиционные операторы try / finally, полностью потеряет исходное исключение и пропустит только то, которое было брошено в блоке finally. В операторе try-with-resources среда выполнения будет подавлять исключение, которое вызывает метод close (), и отбрасывать исходное исключение вверх по стеку при условии, что это исходное исключение вызвало все проблемы в первом место. Кроме того, вместо того, чтобы оставить другое исключение сборщику мусора, это подавление позволяет извлекать закрытые исключения с помощью Throwable.getSuppressed.
  • Числовые литералы можно сделать проще для чтения. Все числовые литералы допускают подчеркивание , поэтому такие вещи int n = 1000000000можно сделать намного более удобочитаемыми int n = 1_000_000_000, что намного проще анализировать как миллиард, и сложнее вводить неправильно, не замечая этого. Также разрешены двоичные литералы в форме 0b10110101, что делает код, работающий с битовыми полями, более приятным для чтения.
  • Обработка нескольких типов исключений в одном и том же операторе catch может быть выполнена, что сокращает дублирование кода и потенциально упрощает последующий рефакторинг.

Каждое из этих изменений - это то, о чем ваш менеджер может не заботиться напрямую, но они немного облегчают написание правильного кода без особых усилий и размышлений, освобождая ваш ум, чтобы немного больше сосредоточиться на реальной логике, которую вы пытаетесь реализовать, и они также облегчают чтение кода позже, делая отладку немного быстрее.

На стороне API также произошел ряд обновлений API:

  • С точки зрения безопасности , несколько методов шифрования были добавлены / устарели, так как криптография движется вперед.
  • Файловый ввод-вывод был изменен ( хотя это может быть и лучшая ссылка ), добавив некоторую лучшую абстракцию в ряде мест. Лично я не углублялся в новые вещи ввода-вывода, но это выглядит как очень полезный пересмотр, облегчающий работу с файловой системой без особой боли.
  • Поддержка Unicode до Unicode 6.0, наряду с рядом других улучшений интернационализации.
  • Java2D , который вы упомянули в своем вопросе, был улучшен. Лучшая поддержка шрифтов Linux, лучшая прорисовка X11 на современных машинах и обработка тибетских скриптов.
Билли Мэйлман
источник
1
Nit pick: на самом деле строковый переключатель работает «как если бы он использовал String.equalsметод» (из документа, на который вы ссылались). На самом деле, компилятор может оптимизировать его так, чтобы String.equalsон не использовался ... при условии, что чистый эффект одинаков. (И я ожидаю, что он будет использовать String.hashcodeвыше определенного количества случаев переключения.)
Стивен C
Правда достаточно. Большинству компиляторов разрешено выполнять массу оптимизаций, которые не меняют семантику, поэтому часто бывает ненужно указывать на такие мелочи; Я только что особо упомянул .equals (), чтобы явно указать, что регистр не игнорируется. Тем не менее, я немного обновил формулировку.
Билли Мэйлман
Строковые ключи не рекомендуется использовать, поскольку вы переключаетесь на несвязанный домен. Включение Enums - это типичная золотая середина, так как вы можете иметь представление типа String, но с семантическим значением. Да и +1 за полный ответ Кстати.
Мартейн Вербург
Каковы преимущества использования строк в операторе switch вместо целочисленных констант?
Джорджио
3
единственной деловой причиной среди них могут быть улучшения безопасности. Технические тонкости являются спорными и совершенно неактуальными для деловых людей.
jwenting
8

примерочных с-ресурсы - это функция, которую стоит обновить до Java 7, и все это само по себе. Утечки ресурсов / утечки памяти представляют собой большой риск при разработке Java, и TWR значительно снижает этот риск.

Я добавлю, что новые абстракции файлов NIO.2 и асинхронные возможности также заслуживают внимания, если в вашем приложении есть функции файлового / сетевого ввода-вывода.

Мартейн Вербург
источник
Они также уменьшают количество необходимого PermGen и используют вместо этого кучу или встроенную память, я не уверен, где она будет храниться сейчас. Это означает, что в Java 8 вам не нужно устанавливать два максимальных параметра памяти.
Эндрю Финнелл
Разве попытка с ресурсами не такая же, как попытка наконец, но с меньшим количеством образца?
jhewlett
1
Я думаю, что идея состоит в том, что меньшее количество шаблонов означает, что легче разобраться.
MatrixFrog
1
Меньше варочной панели и правильного смыкания. Они обнаружили, что внутри OpenJDK они делали это вручную неправильно примерно в 2/3 случаев ... Я подозреваю, что другие высокие проценты этого в других частях кода.
Мартейн Вербург
6

Может быть причина, по которой вам не следует переключаться на Java 7: если вам нужно использовать виртуальную машину Oracle, а ваше программное обеспечение работает на встроенном оборудовании или вы будете распространять ее на встроенном оборудовании: Oracle изменила лицензию JRE, чтобы она не лицензировалась, если указано выше условия выполнены; вам нужно будет купить встроенную лицензию Java SE. См. Что означает «система общего назначения» для Java SE Embedded?

Восстановить Монику - М. Шредер
источник