Java 6からJava 7への移行を正当化する方法は?


28

Java 6からJava 7に移行していました。このプロジェクトは予定より遅れており、リスクが低下しています。その場合、引き続きJava 6を使用します。

マネージャーに戻って、JDK 7を使用することが重要であると確信できるJava 7の具体的な改善点は何ですか?(Java 6に関して)Oracle Java 7で強調できるバグ修正を探しています。私の場合、セキュリティ、パフォーマンス、Java 2D /印刷などの修正がより売れるでしょう。たとえば、コンパイラの修正はあまり役に立ちません。

[ Oracle導入ガイド、バグデータベース、Stack Overflow に関する質問など、多くのサイトを調べています]。

更新:答えてくれてありがとう。更新を次のリリースに再スケジュールしました。最も近いのはセキュリティです。最も投票数の多い回答を受け入れます。


5
幸運ですね。Stack Overflowでまだ頻繁にポップアップする質問から判断すると、一部の人々はまだJava 1.4(11年前のプラットフォームです!)にこだわっています。
ヨアヒムザウアー

3
必要な7の機能をまだ知らないのに、なぜ今アップグレードを行うのですか?たぶん、あなたは時間を無駄にしているので、 それを正当化する方法よりも、正当化すべきかどうかについてもう少し考えるべきです。
ブライアンオークリー

1
それは私だけですか、タイトルは逆ですか?
ラドゥマーゼア

1
より大きな質問は、なぜアップグレードがそんなに苦労しているのですか?私は1週間で100万のlocプロジェクトをJava 7にアップグレードすることができました。あなたの問題に対する答えは、なぜあなたがアップグレードをそんなに苦労しているのかを分析することだと思います。
アンドリューTフィネル

2
@ Andrew Finnell:ごめんなさい。私はそれがそれほど関連するとは思わなかった。実際の移植は1週間以内に完了しました。主に使用したsun独自のAPIが原因です。これは、コードの実際の行数(約400万行)よりも影響を受ける機能固有の互換性のコードでした。発生した遅延は、ツールサポートなどのさまざまな要因によるものでした。たとえば、cobertura 2.0を使用したコードカバレッジです。ただ安定しています。もう1つのツールは、Rational Functional Testerで、アップグレードが必要でした(実行しないことを選択しました)。努力に影響を与えた全体的な要因についてのメモを書くかもしれません
。– Jayan

回答:


44

Java 6は今年2月にEOLに達しており非常に高価なエンタープライズサポートを購入しない限り、パブリックアップデート(セキュリティを含む)を受信できなくなります。

それがすべての必要な理由であるはずです。

さらに、圧倒的な証拠は、Javaランタイムの後方互換性が優れていることを示唆しています。Java 6のインストールをJava 7に置き換えるだけで、すべてのアプリケーションが問題なく動作し続ける可能性があります。もちろんこれは保証されておらず、実際に問題がないことを確認するための広範なテストが推奨されます。


2
それは受け入れられた答えであるべきです。EOL日付ベースの推論は、特にJavaを含む特定の製品の更新を正当化する必要があるときはいつでも、私にとって最適に機能することが証明されています。正当性を完全にするために、後方バイナリ互換性に関するメモ(できれば公式のOracleステートメントでバックアップする)と、更新をスモークテストする必要性に関するメモ(たとえば、バージョンへのハードコーディングされた参照に対する予期しない依存関係の場合)アプリケーション構成の6 ")
-gnat

1
基本的に、ほとんどの企業がアップグレードする唯一の理由です。
13

マイケル、答えに私が言及したメモ(互換性と煙のテストに関する説明)を追加するのは理にかなっていますか?いわば完全を期すために
ブヨ

1
@gnat:完了しましたが、移行に反対する人々にテストの必要性について話す必要があるのではないかと疑っています。最も重大な非互換性あること間違いありません。
マイケルボルグワード

@MichaelBorgwardt、それについて話すのはややトリッキーなことであり、技術的に正しいというよりも説得力があるということにより関係しています。私は、「変化に反対する」人がいるときに、そのようなことを明示的かつ明確に述べるかなり難しい方法を学びました。それら信号、「私たちは耳を傾け、あなたの懸念を共有し、我々はあまりにも心配」を送信し、この種のは、彼らが変更の容易な承認に(無視ではなく)価値を感じる...そして最終的にはリード線ます:)
ブヨ

29

一般に、プログラマーの作業を容易にするために、かなり広範な変更がいくつかあります。あなたのマネージャーはそのようなことをあまり気にしないかもしれませんが、プログラマーが定型コードについて考える時間を減らし、したがって、彼らが実装しているものの実際の目標について考える時間を増やします。これは非常に強力な議論になり得ます。Oracleにはかなり広範な変更のリストがありますが、かなり長いので、可能な限り要約します。

言語機能は次のとおりです。

  • ジェネリック医薬品の定型化が少ない。コード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
  • 数値リテラルを読みやすくすることができます。すべての数値リテラルではアンダースコアを使用できるため、10億と解析しやすくなり、気付かずに間違って入力するのが難しくなり、int n = 1000000000読みint n = 1_000_000_000やすくすることができます。また、フォームではバイナリリテラルが許可されているため0b10110101、ビットフィールドで動作するコードを読みやすくすることができます。
  • 同じcatchステートメントで複数の例外タイプを処理することで、コードの重複を減らし、後でリファクタリングしやすくなります。

これらの変更はどれもマネージャーが直接気にかけないものですが、努力と思考なしで正しいコードを書くのが少し簡単になるので、あなたがしようとしている実際のロジックにもう少し集中できますまた、後でコードを読みやすくするため、デバッグが少し速くなります。

API側では、多くのAPI更新も行われました。

  • 暗号化が前進するにつれて、セキュリティ面でいくつかの暗号化方法が追加/廃止されました。
  • ファイルIOが変更されました(しかし、これはより良いリンクかもしれません)いくつかの場所でいくつかのより良い抽象化を追加します。私は個人的に新しいIOに飛び込みませんでしたが、非常に便利なオーバーホールのように見え、それほど苦労することなくファイルシステムでの作業がはるかに簡単になります。
  • Unicodeサポートは、他の多くの国際化機能強化とともに、Unicode 6.0までです。
  • 質問で言及したJava2Dが改善されました。Linuxフォントのサポートの改善、最新のマシンでのX11レンダリングの改善、チベット語スクリプトの処理。

1
Nit pick:実際には、文字列スイッチは(リンクしたドキュメントから)「メソッドを使用しているかのように」String.equals動作します。実際には、コンパイラーは自由に最適化できるため、String.equals使用されません...最終的な効果が同じであれば。(そして、私はそれがString.hashcode一定数以上のスイッチケースを使用すると予想しています。)
スティーブンC

本当です。ほとんどのコンパイラは、セマンティクスを変更しない大量の最適化を許可されているため、そのような小さなことを指摘することはしばしば冗長です。大文字と小文字が無視されないことを明示するために、.equals()のみを具体的に言及しました。それにもかかわらず、私は言葉遣いを少し更新しました。
ビリーメールマン

バインドされていないドメインで切り替えるため、文字列スイッチは推奨されません。ここでは、Stringのような表現を使用できますが、セマンティックな意味を持つことができるため、Enumsをオンにすることは典型的な中間点です。ああ、完全な答えBTWの場合は+1。
マルティン

整数定数の代わりにswitchステートメントで文字列を使用する利点は何ですか?
ジョルジオ

3
それらの中で唯一のビジネス上の理由は、セキュリティの強化かもしれません。技術的な微妙さは議論の余地があり、ビジネスマンにとってまったく無関係です。
13

8

try-with-resourcesは、Java 7にアップグレードする価値がある機能です。リソースリーク/メモリリークはJava開発の大きなリスクであり、TWRはそのリスクを大幅に削減します。

アプリケーションにファイル/ネットワークI / O機能がある場合、新しいNIO.2ファイル抽象化と非同期機能も移行する価値があることを追加します。


また、必要なPermGenの量も削減されており、代わりにヒープメモリまたはネイティブメモリのいずれかを使用しています。現在どこに格納されるかはわかりません。つまり、Java 8では、2つの最大メモリパラメーターを設定する必要はありません。
アンドリューT

try-with-resourcesはtry-finallyと同じではなく、定型文が少ないですか?
ジューレット

1
アイデアは、定型文を減らすことは正しいことをより簡単にすることだと思います。
MatrixFrog

1
ボイラープレートが少なく、正しい閉口法を使用します。彼らは、OpenJDKの内部で 2/3の時間の時間に手動で間違っていることを発見しました。
マーティンヴェルブルク

6

あなたがすべき理由があるかもしれないのJava 7に切り替える:あなたは、OracleのVMを使用する必要がありますし、あなたのソフトウェア組込みハードウェア上で実行されますかのいずれか場合は、組込みハードウェアとそれを配布します。それはだように、Oracleは、JREのライセンスを変更していない上記の場合のライセンス条件が満たされている。Java SE組み込みライセンスを購入する必要があります。Java SE Embeddedの「汎用システム」の意味をご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.