Saya telah menjelajahi fitur-fitur baru di JDK8, seperti ekspresi lambda, metode ekstensi, dan API aliran baru.
Jelas tidak ada fitur-fitur ini yang baru di dunia pemrograman dan yang membuat heran mengapa mendapatkan semua ini di Jawa sampai sekarang.
Kami memiliki ekspresi lambda di Lisp (1958), SML (1973), Haskell (1990), Python (1991), JavaScript (1994), Ruby (1995), Scala (2003), C # (2007) dan 55 tahun setelah Lisp dan praktis semua orang, di Jawa (2013).
Dan saya telah membaca tentang stream di SIC (1996).
Saya bertanya-tanya mengapa sekarang? Bukti menunjukkan bahwa bersaing dengan bahasa lain bukanlah motivasi.
Tampaknya semua fitur baru yang keren dalam rilis Java ini hanyalah produk sampingan dari penerapan paralelisme. Kami memiliki lambdas karena mereka membuat penulisan algoritma paralel lebih sederhana, dan kami memiliki metode ekstensi karena kami membutuhkannya untuk memberikan dukungan terhadap perubahan yang diperlukan ekspresi lambda, dll., Dll.
Jadi, pertanyaan saya adalah: dapatkah kita memastikan bahwa topik utama dalam rilis Jawa yang akan datang ini adalah paralelisme? Atau dapatkah kita menjustifikasi alasan lain untuk kemunculan trik tertua dalam buku sampai sekarang di Jawa?
sumber
The evidence suggests
- tolong bagikan penelitian Anda.Jawaban:
Ketika Java pertama kali dirancang, dianggap tepat untuk mengabaikan fungsi anonim. Saya dapat memikirkan dua alasan (tetapi mereka mungkin berbeda dari yang resmi):
Pada tahun-tahun berikutnya, seperti yang dijelaskan Robert Harvey, kebijakan Sun adalah selalu menjaga Jawa tetap kompatibel dan sangat stabil.
Di sisi lain, bahasa lain yang bersaing telah muncul (yang paling penting adalah C #, yang lahir sebagai klon Jawa dan kemudian mengambil arah pengembangannya sendiri).
Bahasa yang bersaing telah menempatkan Jawa di bawah tekanan karena dua alasan:
Kekuatan ekspresif
Fitur-fitur baru dapat membuat idiom pemrograman tertentu lebih mudah untuk ditulis, membuat bahasa lebih menarik bagi programmer. Biasanya set fitur yang disediakan oleh bahasa adalah kompromi antara kekuatan ekspresif, kompleksitas bahasa, koherensi desain: menambahkan lebih banyak fitur membuat bahasa lebih ekspresif tetapi juga lebih kompleks dan sulit untuk dikuasai.
Bagaimanapun, dalam beberapa tahun terakhir pesaing Java menambahkan banyak fitur baru yang tidak dimiliki Java, dan ini dapat dianggap sebagai keuntungan.
Hype
Ya, sayangnya ini adalah faktor dalam pilihan teknologi, setidaknya dari apa yang dapat saya lihat dalam pengalaman sehari-hari saya sebagai seorang programmer: alat harus memiliki fitur tertentu, bahkan jika sebagian besar anggota tim tidak tahu cara menggunakannya dan mereka yang dapat menggunakannya tidak sering membutuhkannya.
Hype dapat menjadi lebih penting bagi orang-orang non teknis seperti manajer, yang mungkin menjadi orang yang menentukan platform untuk proyek tertentu. Manajer terkadang hanya mengingat beberapa kata kunci seperti lambda, paralelisme, multicore, pemrograman fungsional, komputasi awan, ... Jika teknologi pilihan kami memiliki tanda hijau pada setiap item dalam daftar, maka kami terkini.
Jadi IMO untuk beberapa waktu Java telah terjebak di antara
Akhirnya Oracle memutuskan untuk memutakhirkan Java agar lebih kompetitif. Menurut pendapat saya, fitur-fitur baru membahas terutama programmer Java yang mungkin tergoda untuk beralih ke C # dan yang melihat bahasa lain seperti Scala dan Clojure terlalu berbeda dari Jawa. Di sisi lain, pengembang yang memiliki pengalaman dengan pemrograman fungsional dan masih ingin menggunakan JVM mungkin sudah beralih ke Scala, Clojure, atau bahasa lain.
Jadi fitur Java 8 yang baru akan membuat Java lebih kuat sebagai bahasa dan fokus yang dinyatakan adalah pemrograman bersamaan dan paralel, tetapi upgrade tersebut tampaknya juga mencakup aspek pemasaran (Mark Reinhold, kepala arsitek Java di Oracle, mengatakan: "Beberapa orang akan mengatakan menambahkan ekspresi Lambda hanya untuk bersaing dengan anak-anak keren, dan ada beberapa kebenaran di dalamnya, tetapi alasan sebenarnya adalah prosesor multicore; cara terbaik untuk menanganinya adalah dengan Lambda ", lihat artikel ini ).
Jadi, ya, banyak (semua) fitur Java 8 sudah terkenal, tetapi mengapa dan kapan fitur ditambahkan ke bahasa tergantung pada banyak faktor: audiens target, komunitas yang ada, basis kode yang ada, pesaing, pemasaran, dll.
EDIT
Catatan singkat tentang "... Saya telah membaca tentang stream di SIC (1996).": Apakah Anda bermaksud bahwa Anda memerlukan Java 8 lambdas untuk mengimplementasikan stream? Sebenarnya Anda bisa menerapkannya menggunakan kelas dalam anonim.
sumber
Java telah mengubah fokus dengan waktu. Pada awalnya itu dirancang sebagai bahasa yang kuat sederhana, sebagai reaksi terhadap "powerful complex" C ++. Beberapa fitur yang ada di C ++ sengaja ditinggalkan, seperti overloading operator, templat, enum, yang dianggap terlalu rumit atau peninggalan era C, dan OOP berada di puncak popularitasnya, semuanya dijadikan Object dalam satu pandangan dunia paradigma. Lambdas saat ini dianggap "tidak diperlukan" sejak diperkenalkannya kelas anonim / batin di Jawa 1.1. Fakta bahwa sintaksisnya jauh lebih verbose hampir dianggap sebagai fitur .
Java telah menemukan publiknya, tidak ada insentif untuk berubah hingga Microsoft memperkenalkan C #, yang belajar dari pelajaran kesalahan desain Java, dan meluncurkan serangkaian fitur bahasa baru. Mereka tidak dibatasi oleh kompatiblitas mundur. Saya pikir bahwa para konsepsi Java menyadari bahaya kompetisi C # dan merilis Java 5 dengan generik, enum, dll.
Dimasukkannya lambdas di Jawa dibahas sejak saat itu dan itu hanya diperburuk oleh tren saat ini untuk pemrograman fungsional. Tetapi hal-hal seperti ini lambat untuk diperbaiki, dan itu harus benar pertama kali. Menurut pendapat saya Java gagal generik dengan tipe erasure karena kompatibilitas ke belakang dianggap sebagai alasan untuk menerapkannya tidak lebih dari gula sintaksis. Penutupan telah dipikirkan lebih teliti, tampaknya, dan itu akan lebih dari sekadar gula sintaksis.
Kesimpulannya, apa topik utama Java 8? Saya rasa versi bahasa tidak memiliki topik. Sebagai C ++ 11, raison d'etre Java 8 adalah untuk mengikuti kompetisi dengan memperkenalkan dalam bahasa hal-hal yang semakin banyak diterima oleh programmer. Lisp mungkin memiliki lambda sejak tahun 1958, popularitasnya telah meningkat selama beberapa dekade sekarang dan hanya pemrograman fungsional baru-baru ini dianggap serius untuk pemrograman "arus utama" (karena tidak ada kata yang lebih baik).
sumber
Karena Java harus melalui proses persetujuan yang melibatkan beberapa pemangku kepentingan dengan visibilitas tinggi dalam proses yang mirip dengan "desain oleh komite", dan proses itu membutuhkan waktu, itu saja.
Bandingkan dengan bahasa lain dan Anda akan menemukan diktator yang baik hati, atau komite kecil perancang bahasa yang bekerja sama secara erat dan tidak terikat dengan kepentingan perusahaan.
Kombinasikan itu dengan basis kode yang sudah ada dari jutaan baris kode Java yang harus tetap kompatibel, dan Anda memiliki semua bahan untuk perubahan dengan kecepatan glasial.
sumber
Saya akan mengatakan bahwa tujuan paling penting dari bahasa pemrograman adalah untuk digunakan; Saat ini C dan Java tidak memiliki ekspresi lambda dan mereka adalah bahasa yang paling banyak digunakan (menurut TIOBE misalnya).
Dan untuk menjawab pertanyaan saya percaya bahwa Java ditujukan kepada perusahaan; dalam domain ini segala sesuatu harus sangat stabil dan dapat diandalkan; misalnya Java 7 telah muncul selama hampir 2 tahun namun saya tidak tahu secara langsung proyek apa pun di Java 7. Juga hal penting lainnya adalah kompatibilitas ke belakang yang sangat penting bagi perusahaan.
sumber