Bagaimana cara membenarkan migrasi dari Java 6 ke Java 7?

28

Kami bermigrasi dari Jawa 6 ke Jawa 7 . Proyek ini terlambat dan berisiko dibatalkan, dalam hal ini ia akan terus menggunakan Java 6.

Apa saja perbaikan khusus di Java 7 yang dapat kami gunakan untuk kembali ke manajer kami dan meyakinkannya bahwa penting untuk menggunakan JDK 7? Mencari perbaikan bug yang bisa saya sorot di Oracle Java 7 (sehubungan dengan Java 6). Perbaikan dalam keamanan, kinerja, Java 2D / pencetakan, dll. Akan lebih laku dalam kasus saya. Perbaikan kompiler misalnya, tidak akan banyak digunakan.

[Saya akan menelusuri banyak situs seperti panduan adopsi Oracle , basis data bug, pertanyaan tentang Stack Overflow].

Pembaruan: Terima kasih atas jawabannya. Kami menjadwal ulang pembaruan untuk rilis berikutnya. Yang paling dekat adalah keamanan. Menerima jawaban dengan suara tertinggi.

Jayan
sumber
5
Anda beruntung. Dilihat dari pertanyaan yang masih sering muncul di Stack Overflow , beberapa orang masih terjebak dengan Java 1.4 (platform yang berusia 11 tahun!).
Joachim Sauer
3
Mengapa Anda melakukan peningkatan sekarang jika Anda belum mengetahui beberapa fitur dalam 7 yang Anda butuhkan? Mungkin Anda membuang-buang waktu dan harus memikirkan sedikit lebih banyak tentang apakah Anda harus membenarkannya daripada bagaimana Anda harus membenarkannya.
Bryan Oakley
1
Apakah hanya saya atau judulnya terbalik?
Radu Murzea
1
Pertanyaan yang lebih besar adalah: Mengapa Anda mengalami kesulitan memperbarui? Saya dapat memutakhirkan satu juta proyek loc dalam seminggu ke Java 7. Saya pikir jawaban untuk masalah Anda adalah menganalisis mengapa Anda mengalami kesulitan melakukan upgrade.
Andrew T Finnell
2
@ Andrew Finnell: Maaf. Saya tidak berpikir itu relevan. Porting sebenarnya selesai dalam waktu kurang dari seminggu. Terutama karena api milik matahari yang kami gunakan. Itu adalah kode yang terpengaruh kompatibilitas spesifik fungsi daripada jumlah aktual baris kode (kira-kira 4 juta). Keterlambatan yang disebabkan adalah karena berbagai faktor seperti dukungan alat- Misalnya cakupan kode menggunakan cobertura 2.0. hanya stabilisasi. Alat lain adalah Rasional Fungsional Tester yang memerlukan peningkatan (kami memilih untuk tidak melakukan). Mungkin saya akan menulis catatan tentang faktor-faktor keseluruhan yang mempengaruhi upaya ..
Jayan

Jawaban:

44

Java 6 telah mencapai EOL pada bulan Februari tahun ini dan tidak akan lagi menerima pembaruan publik (termasuk keamanan) kecuali jika Anda membeli dukungan perusahaan yang sangat mahal.

Itu harus menjadi alasan yang dibutuhkan.

Selain itu, banyak bukti menunjukkan bahwa kompatibilitas ke belakang untuk runtime Java sangat baik. Kemungkinannya adalah Anda hanya perlu mengganti instalasi Java 6 dengan Java 7 dan semua aplikasi akan terus bekerja tanpa masalah. Tentu saja ini tidak dijamin dan tes ekstensif disarankan untuk mengkonfirmasi bahwa memang tidak akan ada masalah.

Michael Borgwardt
sumber
2
itu harus menjadi jawaban yang diterima. Penalaran berbasis tanggal EOL telah terbukti bekerja paling baik untuk saya setiap kali ada kebutuhan untuk membenarkan pembaruan produk tertentu, khususnya termasuk Jawa. Untuk melengkapi pembenaran, saya juga akan menambahkan catatan tentang kompatibilitas biner mundur (lebih disukai didukung dengan beberapa pernyataan Oracle resmi) dan catatan tentang perlunya merokok menguji pembaruan (untuk kasus misalnya beberapa dependensi tak terduga pada referensi hardcoded ke versi " 6 "dalam konfigurasi aplikasi)
nyamuk
1
itu pada dasarnya satu-satunya alasan kebanyakan perusahaan akan memperbarui.
jwenting
Michael, apakah masuk akal untuk menambahkan catatan yang saya sebutkan ( klarifikasi tentang kompatibilitas dan pengujian asap ) ke dalam jawaban Anda? demi kelengkapan sehingga untuk berbicara
nyamuk
1
@gnat: selesai, meskipun saya ragu orang-orang yang menentang migrasi perlu diberi tahu tentang perlunya pengujian dan lebih dari sekadar tes asap juga. Ada yang paling pasti kadang - kadang tidak kompatibel serius.
Michael Borgwardt
@MichaelBorgwardt dengan baik, menceritakan tentang itu adalah hal yang agak rumit dan lebih berkaitan dengan memaksa daripada secara teknis benar. Untuk satu cara saya belajar agak sulit untuk menyatakan hal-hal seperti itu secara eksplisit dan jelas ketika ada orang-orang "menentang perubahan". Ini mengirimkan sinyal kepada mereka, "kami mendengarkan dan berbagi kekhawatiran Anda, dan kami juga khawatir", membuat mereka merasa dihargai (berlawanan dengan yang diabaikan) ... dan akhirnya mengarah pada persetujuan perubahan yang lebih mudah :)
gnat
29

Secara umum, ada sejumlah perubahan yang cukup luas untuk membuat segalanya lebih mudah pada programmer. Manajer Anda mungkin tidak terlalu peduli tentang hal-hal seperti itu, tetapi membuat programmer menghabiskan lebih sedikit waktu untuk memikirkan kode boilerplate, dan dengan demikian memiliki lebih banyak waktu untuk memikirkan tujuan sebenarnya dari apa yang mereka laksanakan, harus meningkatkan efisiensi, mengurangi bug, dll., yang bisa menjadi argumen yang sangat kuat. Oracle memiliki daftar perubahan yang cukup luas , tetapi agak panjang, jadi saya akan meringkas sebanyak mungkin.

Fitur bahasa termasuk:

  • Lebih sedikit boilerplate pada Generics. Kode Map<String, String> myMap = new HashMap<String, String>();dapat dikurangi menjadi Map<String, String> myMap = new HashMap<>(). Kompilator dapat menyimpulkan tipe Generik yang diperlukan di sisi kanan dari kiri, sehingga kode Anda menjadi sedikit lebih pendek dan lebih cepat dibaca.
  • String bekerja dalam pernyataan switch sekarang , menggunakan semantik dari .equals()metode, bukan ==.
  • Manajemen sumber daya otomatis menggunakan coba-dengan-sumber daya. Ini membuat kode lebih bersih, tetapi juga memiliki keunggulan dibandingkan kode coba / akhirnya berbasis gaya lama. Jika pengecualian dilemparkan dalam pernyataan coba, dan kemudian yang lain dilemparkan saat menutup, kode yang menggunakan pernyataan try / akhirnya tradisional akan benar-benar kehilangan pengecualian asli, dan hanya melewatkan yang dilemparkan di blok akhirnya. Dalam pernyataan coba-dengan-sumber daya, runtime akan menekan pengecualian yang ditutup oleh () panggilan dilemparkan, dan menggelembungkan pengecualian asli di atas tumpukan, dengan asumsi bahwa pengecualian asli ini adalah salah satu yang menyebabkan semua masalah di pertama tempat. Selain itu, alih-alih meninggalkan pengecualian lain ke pengumpul sampah, penindasan ini memungkinkan pengecualian yang dilemparkan dengan menggunakan Throwable.getSuppressed.
  • Literal angka dapat dibuat lebih mudah dibaca. Semua literal numerik memungkinkan garis bawah , sehingga hal-hal seperti int n = 1000000000dapat dibuat menjadi lebih mudah dibaca int n = 1_000_000_000, yang jauh lebih mudah untuk diurai menjadi satu miliar, dan lebih sulit untuk mengetik secara salah tanpa memperhatikan. Juga, literal biner diizinkan dalam bentuk 0b10110101, membuat kode yang berfungsi dengan bit-bidang sedikit lebih baik untuk dibaca.
  • Menangani beberapa tipe pengecualian ke pernyataan tangkap yang sama dapat dilakukan, mengurangi kode duplikasi, dan berpotensi membuatnya lebih mudah untuk refactor nanti.

Setiap perubahan ini adalah sesuatu yang manajer Anda mungkin tidak peduli secara langsung, tetapi mereka membuatnya sedikit lebih mudah untuk menulis kode yang benar tanpa banyak usaha dan pemikiran, membebaskan pikiran Anda untuk lebih fokus pada logika aktual yang Anda coba untuk mengimplementasikan, dan mereka juga membuatnya sedikit lebih mudah untuk membaca kode nanti, membuat debugging sedikit lebih cepat.

Di sisi API, sejumlah pembaruan API juga terjadi:

  • Dari segi keamanan , beberapa metode enkripsi telah ditambahkan / tidak digunakan lagi, karena crypto selalu bergerak maju.
  • File IO telah diubah, ( ini mungkin tautan yang lebih baik ) menambahkan beberapa abstraksi yang lebih baik di sejumlah tempat. Saya belum secara pribadi menyelidiki hal-hal IO baru, tetapi sepertinya perbaikan yang sangat berguna, membuatnya lebih mudah untuk bekerja dengan sistem file tanpa banyak rasa sakit.
  • Dukungan Unicode hingga Unicode 6.0, bersama dengan sejumlah peningkatan internasionalisasi lainnya.
  • Java2D , yang Anda sebutkan dalam pertanyaan Anda, telah ditingkatkan. Dukungan font Linux yang lebih baik, rendering X11 yang lebih baik pada mesin modern, dan penanganan skrip Tibet.
Billy Mailman
sumber
1
Nit pick: Sebenarnya string switch berfungsi "seolah-olah menggunakan String.equalsmetode" (dari dokumen yang Anda tautkan). Pada kenyataannya, kompiler bebas untuk mengoptimalkan sehingga String.equalstidak digunakan ... asalkan efek bersihnya sama. (Dan, saya berharap bahwa itu akan digunakan di String.hashcodeatas sejumlah kasus saklar.)
Stephen C
Cukup benar. Kebanyakan kompiler diizinkan untuk melakukan satu ton optimisasi yang tidak mengubah semantik, jadi seringkali berlebihan untuk menunjukkan hal-hal kecil seperti itu; Saya hanya menyebutkan .equals () secara eksplisit bahwa case tidak diabaikan. Meskipun demikian, saya telah memperbarui kata-katanya sedikit.
Billy Mailman
Pergantian string tidak disarankan karena Anda mengaktifkan domain yang tidak terikat. Mengaktifkan Enums adalah jalan tengah yang khas di sini karena Anda dapat memiliki representasi seperti String, tetapi dengan makna semantik. Oh dan +1 untuk jawaban lengkap BTW.
Martijn Verburg
Apa keuntungan menggunakan string dalam pernyataan switch alih-alih konstanta integer?
Giorgio
3
satu-satunya alasan bisnis di antara mereka mungkin peningkatan keamanan. Kebaikan teknis keduanya bisa diperdebatkan dan sama sekali tidak relevan bagi pebisnis.
jwenting
8

try-with-resources adalah fitur yang layak ditingkatkan ke Java 7, semuanya milik sendiri. Kebocoran sumber daya / kebocoran memori adalah risiko besar dalam pengembangan Java dan TWR mengurangi risiko itu secara signifikan.

Saya akan menambahkan abstraksi File NIO.2 baru dan kapabilitas Asynchronous juga layak dipindahkan jika aplikasi Anda memiliki fitur I / O File / Jaringan.

Martijn Verburg
sumber
Mereka juga mengurangi jumlah PermGen yang dibutuhkan dan menggunakan Heap atau memori asli sebagai gantinya, saya tidak yakin di mana ia akan disimpan sekarang. Ini berarti dengan Java 8 Anda tidak perlu mengatur dua parameter memori maks.
Andrew T Finnell
Bukankah coba-dengan-sumber daya sama dengan coba-akhirnya tetapi dengan lebih sedikit boilerplate?
jhewlett
1
Saya pikir idenya adalah bahwa lebih sedikit boilerplate berarti lebih mudah untuk memperbaikinya.
MatrixFrog
1
Lebih sedikit boiler-plate dan smeantics penutup yang benar. Mereka menemukan bahwa di dalam OpenJDK mereka melakukannya secara manual salah sekitar 2/3 dari waktu itu .... Saya menduga persentase tinggi lainnya dari ini dalam korpus kode lainnya.
Martijn Verburg
6

Mungkin ada alasan mengapa Anda tidak boleh beralih ke Java 7: Jika Anda harus menggunakan VM Oracle dan perangkat lunak Anda berjalan pada perangkat keras yang disematkan atau Anda akan mendistribusikannya dengan perangkat keras yang disematkan: Oracle mengubah lisensi JRE sehingga tidak berlisensi jika di atas kondisi terpenuhi; Anda harus membeli lisensi tertanam Java SE. Lihat Apa yang dimaksud dengan "sistem tujuan umum" untuk Java SE Embedded?

Pasang kembali Monica - M. Schröder
sumber