Saya memiliki aplikasi lama yang ditulis menggunakan Java 7. Ini berjalan dengan baik di Java 8 JRE. Saya tidak berencana untuk menulis ulang salah satu kode untuk menggunakan fitur Java 8. Apakah ada manfaat teknis untuk memutakhirkan kode yang dikompilasi ke Java 8 JDK terbaru?
Supaya jelas, kode saat ini dikompilasi dengan Java 7 dan sudah berjalan dengan Java 8 JRE terbaru. Seharusnya sudah mendapat manfaat dari perbaikan runtime Java 8. Pertanyaan ini adalah apakah manfaat apa pun akan diperoleh dengan mengkompilasi dengan versi 8 dan menjalankannya dengan kode byte yang dikompilasi Java 8.
Juga, saya tidak peduli dengan manfaat non-teknis seperti produktivitas pengembang. Saya pikir itu penting tetapi bukan inti dari pertanyaan ini. Saya meminta demi kode produksi yang tidak memiliki tim pengembangan. Ini murni dalam mode pemeliharaan.
sumber
Jawaban:
Jika saya memahami pertanyaan dengan benar, Anda ingin tahu apakah bytecode yang dihasilkan oleh
javac
akan "lebih baik" di Java 8 daripada di Java 7.Jawabannya mungkin tidak, mereka terus-menerus memperbaiki bug di kompiler dan yang kadang-kadang mengarah ke bytecode yang lebih efisien. Tapi Anda tidak akan melihat peningkatan signifikan dari perbaikan ini untuk Java 8 sejauh yang saya bisa lihat, changelog hanya mencantumkan 2 perubahan besar antara versi.
Situs web oracle sangat buruk dan sepertinya saya tidak bisa mendapatkan daftar perbaikan bug yang terkait dengan
javac
antar versi, tetapi di sini ada yang tidak lengkap dari OpenJDK . Mayoritas yang saya dapat temukan adalah memperbaiki kesalahan. Jadi dengan memperbarui ke Java 8, ada kemungkinan ia tidak dapat mengkompilasi lagi karenajavac
lebih tepatnya mengikuti JLS dan akan ada sangat sedikit atau tidak ada "perbaikan" pada bytecode.sumber
Manfaat utama adalah bahwa Java 8 memiliki perbaikan bug terbaru sedangkan Java 7 tidak diperbarui secara publik.
Juga jika Anda akan menjalankan kode pada Java 8 JVM, Anda mungkin juga hanya memiliki satu versi Java yang diinstal.
Java 8 mungkin lebih cepat, dan memiliki dukungan yang lebih baik untuk fitur-fitur baru seperti G1. Namun, ini mungkin lebih lambat untuk kasus penggunaan Anda sehingga satu-satunya cara untuk mengetahuinya adalah dengan mengujinya.
Jika Anda bertanya apakah ada manfaat dalam mengkompilasi ulang kode Java 7 di kompiler Java 8, jawabannya adalah; hampir tidak ada.
Satu-satunya perbedaan halus adalah bahwa ada perbedaan kecil pada Java API, jadi mungkin ada perbedaan yang sangat halus yang mungkin ditemukan oleh kompiler Java 8 bahwa Java 7
Perbedaan kecil lainnya adalah angka ajaib pada awal file, mungkin urutan pool konstan. Kode byte pada dasarnya sama, bahkan dukungan
invokedynamic
yang ditambahkan untuk lambdas ada di Java 7 tetapi tidak digunakan seperti itu.sumber
Ini bisa membantu dengan menciptakan kesadaran .
Saat Anda beralih ke Java8, Anda mungkin menemukan peringatan tambahan yang dipancarkan oleh javac. Contoh: inferensi tipe telah sangat ditingkatkan dengan Java8. Dan itu bisa menghilangkan kebutuhan untuk penjelasan @SuppressWarnings di basis kode Anda saat ini (dan ketika penjelasan seperti itu tidak lagi diperlukan, kompiler memperingatkan tentang itu).
Jadi, bahkan ketika Anda tidak bermaksud untuk memodifikasi basis kode Anda hari ini, beralih ke Java8 dapat memberi tahu Anda tentang hal-hal seperti itu. Meningkatkan pengetahuan Anda dapat membantu dalam membuat keputusan yang tepat.
Di samping itu:
Singkat cerita: ada beberapa keuntungan yang tidak kentara, dan risiko tertentu (di mana pentingnya risiko tersebut tergantung pada pengaturan keseluruhan Anda).
sumber
Saya akan lakukan setidaknya untuk fakta-fakta ini.
1) HashMap internal (lebih cepat di bawah jdk-8)
2) Banyak bug diperbaiki yang mungkin transparan bagi Anda (optimasi runtime) yang akan membuat kode Anda lebih cepat dan lebih baik tanpa Anda benar-benar melakukan apa pun.
3) Pengumpul Sampah G1
EDIT
Dari sudut pandang teknis, ini kedengarannya lebih mirip dengan Kompilasi Ahead of Time atau sesuatu yang mungkin ditingkatkan oleh kompiler dengan menganalisis kode lebih banyak. Sejauh yang saya tahu hal-hal seperti itu tidak dilakukan dalam kompiler java 8.
Dari sudut pandang pengembang - ada banyak. Peningkatan produktivitas adalah yang paling penting bagi saya.
EDIT 2
Saya hanya tahu dua poin yang cocok dengan permintaan kedua Anda:
untuk mempertahankan nama parameter metode.
Disebut Pilihan Profil Ringkas untuk jejak yang lebih kecil.
sumber
Jika Anda tidak memiliki alasan lain untuk mengkompilasi ulang aplikasi Anda, maka itu mungkin tidak membuat banyak perbedaan, sebagaimana dinyatakan dalam jawaban yang diterima.
Namun, jika Anda harus mengkompilasi ulang hanya sekali saja, pertimbangkan ini:
-source 7
dengan javac);-source 7
daripada-source 8
jika Anda mengkompilasi dengan JDK 8 dan runtime target Anda adalah Java 8;-source 8
jaminan bahwa pengembang menggunakan Java 8 (atau lebih baru) untuk kompilasi dan runtime (saat diberlakukan-target 8
).Kesimpulannya, jangan kompilasi ulang jika Anda tidak perlu. Namun, pada kesempatan pertama Anda harus mengkompilasi ulang (karena perubahan kode), beralih ke Java 8. Jangan mengambil risiko memiliki bug karena ketidakcocokan lingkungan, dan jangan membatasi pengembang tanpa alasan yang baik.
sumber
-source 7
tetapi tidak mengkompilasi dengan-source 8
? Juga, dapatkah Anda menunjukkan kontradiksi karena komentar Anda tidak terlalu konstruktif seperti itu ...