- Kini program pertama Java tidak lagi harus dimulai dengan public static void main(String[] args), dan bisa ditulis dengan sintaks yang disederhanakan void main()
- Dalam sintaks baru, input dan output bisa ditangani hanya dengan pemanggilan sederhana seperti IO.readln dan IO.println, sehingga kode menjadi jauh lebih intuitif
- Sintaks bertele-tele yang lama seperti new Scanner(System.in) dan System.out.println menjadi tidak diperlukan lagi
- Ketidaknyamanan selama ini "akhirnya berakhir", dan kini struktur dasar Java menjadi lebih ringan sehingga hambatan masuk menurun dan kemudahan belajar akan meningkat secara signifikan
- Secara tradisional, Java mengharuskan deklarasi panjang
public static void main(String[] args)untuk memulai program - Namun, per 16 September 2025, deklarasi kompleks fungsi
mainyang dianggap sebagai contoh paling pertama di Java telah digantikan oleh bentuk baru yang lebih sederhana - Cara lama:
public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("What is your name? "); String name = scanner.nextLine(); System.out.println("Hello, " + name); } } - Cara baru:
void main() { var name = IO.readln("What is your name? "); IO.println("Hello, " + name); } - Selama ini, sintaks tersebut dikritik karena terlalu bertele-tele bagi pemula dan harus dihafal seperti “mantra ajaib”
- Dengan mengatasi kerepotan dan kerumitan deklarasi lama serta menghadirkan sintaks yang ringkas, keterbacaan kode meningkat dan hambatan untuk mulai belajar Java turun drastis
- Contoh dasar kini tidak lagi memakai pembuatan objek dan pemanggilan yang rumit seperti Scanner, System.out.println
> Good Fucking Riddance = “Akhirnya hilang juga, rasanya lega. Selamat tinggal”
5 komentar
Kedengarannya seperti mengatakan bahwa cara lama sudah mati hanya karena muncul satu cara baru yang lain.
Apakah benar cara lama benar-benar tidak bisa lagi digunakan dan kita harus memakai cara baru?
Wow
Harus belajar Java lagi ya..
mainsudah mati. Hidupmain!Opini Hacker News
Seiring waktu, saya rasa saya akan merindukan proses ketika potongan kode asing seperti ini perlahan mulai bisa dipahami. Saat pertama belajar Python lalu beralih ke Java, saya tidak tahu apa arti tipe seperti
voidatauString[], jadi terasa menarik. Setelah belajar tipe, saya mulai paham, lalu setelah itu saya mengerti konsep class dan object, serta kenapamainada sebagai metode static. Saat menggali lebih dalam dan mempelajari kapan class ini dipanggil, kode yang awalnya hanya tampak seperti boilerplate mulai terasa masuk akal. Mungkin pengembang Java yang jauh lebih berpengalaman bisa membaca lebih banyak makna dari satu baris itu dibanding saya. Meski begitu, sekarang setelah itu hilang, rasanya legaMemang melegakan. Selama 30 tahun terakhir, pendidikan perangkat lunak mengajarkan pengembang untuk menghasilkan kompleksitas yang tidak perlu atas nama "rekayasa". Misalnya, pengembang A membuat class untuk apa pun sesuai kebutuhan, entah itu entry point, callback, interface, dan sebagainya. Hasilnya, kita punya class. Pengembang B lalu menambahkan variabel instance ke class itu dan membuat keseluruhan sistem menjadi mutable, sehingga terbentuklah "lumpur implementasi". Setelah itu pengembang lain menambahkan inheritance demi reuse kode, tapi justru memunculkan lebih banyak kompleksitas dan mimpi buruk dynamic dispatch. Pada akhirnya terbentuk reference cycle dan relasi antar object jadi kusut. Seiring waktu, refactoring makin sulit dan merepotkan, sampai akhirnya kode dihapus dan dimulai ulang dari nol
Saya ingat saat pertama kali belajar pemrograman di kampus, melihat kode ini lalu dosen berkata, "Biasanya saya akan menjelaskan seluruh kodenya, tapi bagian ini untuk sekarang terima saja dulu." Ketika belakangan saya sadar bahwa saya benar-benar memahami seluruh kode itu, rasanya cukup keren. Tapi sekarang sepertinya zamannya memang berubah, jadi terasa melegakan
Sebenarnya metode class static itu nyaris seperti penyangkalan terhadap kenyataan bahwa satu-satunya entry point program harus dikaitkan dengan sebuah class. Bukan cuma C++, bahasa seperti Python dan Ruby juga mengakui realitas prosedural, tetapi Java seolah menutup mata pengguna dan memaksa mereka masuk ke "dunia OOP yang sempurna"
Dari sudut pandang orang yang mengenal gaya lama berbasis class, style baru ini seperti unnamed classes di Java 21 justru memunculkan lebih banyak pertanyaan. Saya jadi bertanya-tanya apakah Java yang benar-benar "segala sesuatu adalah object" ini sedang diubah menjadi bahasa prosedural. Kalau butuh argumen command line, bagaimana caranya? Saya memang biasanya menghindari Java jadi tidak terlalu tahu, tapi ini pertanyaan yang sungguh saya penasaran
Pada era Java 1.2, input standar dibaca seperti ini. Class
Scannermasih terasa asing karena saya baru pertama kali melihatnyaPengalaman saya juga mirip. Karena dulu lama memakai Java, pola
public static void mainsudah terasa akrab, tetapi cara memakaiScannerjustru terasa janggal sehingga saya tidak benar-benar paham alasannyaDalam pengalaman saya, karena sudah puluhan tahun bekerja di proyek besar, bagaimana fungsi
mainditulis sama sekali tidak memengaruhi keseharian atau karier saya. Saya penasaran seberapa besar perubahan seperti ini benar-benar berdampak bagi kalianKalau pengembang Android, dari awal memang tidak ada konsep
main. Sejujurnya, saya tidak merasa implementasi Hello World yang jelek untuk hal sepele bisa dijadikan ukuran apakah bahasa itu menangani hal-hal yang lebih besar dengan baik atau tidakBanyak orang masuk ke dunia pemrograman lewat Java dan mengetik
mainpuluhan kali, tetapi sama sekali tidak tahu apa artinyaBagi pengembang praktis dampaknya tidak besar, tetapi bagi pemula ini penting. Dulu saya pernah mengajar Java, dan mantra ajaib yang harus dihafal sebelum bisa mencetak "Hello, World" itu menjadi hambatan masuk bagi para siswa
Kalau membuat command-line interface mungkin ada dampaknya, tetapi tidak banyak orang membuat CLI dengan Java
Dalam sekitar 5 tahun terakhir saya tidak pernah melihat
maindi codebase. Dan alih-alih membuat class baru sendiri, biasanya bentuknya lebih sering mengimplementasikan atau mewarisi class yang spesifik ke frameworkJEP 445: Unnamed Classes and Instance Main Methods dirilis di Java 21
https://openjdk.org/jeps/445
Menarik melihat Java akhirnya berevolusi menjadi bahasa yang cukup bagus setelah 30 tahun
Saya pernah menulis banyak kode murni dengan Java dan C++ tanpa framework, dan saat itu boilerplate-nya jauh lebih sedikit dan lebih sederhana. Kenyamanan yang benar-benar terasa bagi saya datang sekitar 10 tahun lalu ketika lambda ditambahkan. Setelah lambda masuk, ukuran kode berkurang dan pengalaman menulis kode terasa jauh lebih menyenangkan. Java sudah lama sangat eksplisit, penuh pengulangan yang tidak perlu, sampai-sampai untuk hal kecil pun rasanya hanya memberi pemeriksaan typo. Suasana seperti ini berlangsung sampai Kotlin naik daun; setelah itu dengan lambda dan anonymous class, pengalaman pengembangan meningkat jauh
Klaim bahwa Java adalah bahasa yang mengerikan itu terlalu berlebihan
Sebaliknya, saya justru merasa bahasa seperti Python masih terasa tidak nyaman bahkan setelah 30 tahun
Mungkin Anda belum pernah benar-benar mengalami bahasa yang buruk, atau standar Anda untuk "tidak mengerikan" memang sangat tinggi
Meski begitu, Java tetap luar biasa dalam hal kompatibilitas ke belakang dan sistem manajemen paketnya
Ini poin yang sempat disebut di komentar sebelumnya, tetapi sebagai pengembang Java, python justru terasa aneh bagi saya dan saya tidak menganggap pendekatan saat ini buruk. Hanya saja, kalau langsung mulai memrogram tanpa memahami dasar abstraksi, ini mungkin bukan pilihan terbaik untuk "belajar pemrograman". Ketika sebuah alat dirancang berorientasi tujuan, berorientasi paradigma, dan semacamnya, kadang bisa muncul abstraksi yang ekstrem. Karena Java dirancang dengan fokus pada OOP, pemikiran berbasis blok seperti interface terasa alami. Modifier akses untuk method/class juga dibedakan dengan jelas berdasarkan untuk siapa mereka ditujukan (
public,protected,default,private, dan seterusnya). Artinya, masuk ke Java dimulai dari keterpaparan interface kepada pengguna, yaitu programmer. Mungkin terlihat aneh, tapi setidaknya konsistenSintaks yang berat tidak berhubungan langsung dengan OOP. Tidak ada definisi OOP sebelum Java muncul yang mengatakan "fungsi tidak boleh ada di luar class". Sun selama bertahun-tahun menolak konsep fungsi mandiri (static import baru di Java 5, closure di Java 8, compact source file/instance main baru sekarang diperkenalkan), akibatnya semua fungsi masih tetap berada di dalam class sampai sekarang (karena alasan kepraktisan dan kompatibilitas, bukan alasan filosofis). Mereka berusaha memaksakan "segala sesuatu adalah object", tetapi dalam praktiknya justru menciptakan kontradiksi dengan memperkenalkan nilai primitive. Tidak ada keuntungan praktis bahwa fungsi harus berada di dalam class. Malah akan lebih baik jika method bisa didefinisikan pada nilai seperti integer. Sebagai catatan, dalam bahasa "OOP murni" seperti Smalltalk, fungsi bisa didefinisikan bebas di luar class dan kode juga bisa dijalankan langsung di REPL
tautan terkait
Alasan Hello World itu penting adalah karena ia bisa sekaligus menunjukkan boilerplate untuk menjalankan program dan kode nyata yang mencetak output. Selain itu, dari sisi konfigurasi build tool, sebagian hal yang terlihat sebagai 'boilerplate' sebenarnya lebih merupakan prosedur untuk latihan atau pengaturan tool. Jika ini dijelaskan sejak awal, sebenarnya bukan masalah besar
Kalau hanya memakai trik compiler untuk membuat class di balik layar, itu cuma perubahan kosmetik. Kalau fungsi top-level lain tetap tidak diizinkan, pada akhirnya ini hanya kasus khusus sehingga tetap terasa janggal
C# mendukung top level statement sejak 9.0, tetapi pada akhirnya tetap diubah menjadi metode statis di balik layar. Banyak fungsi top level juga bekerja dengan cara serupa. Contoh nyata: C# decompiled example
Trik seperti ini adalah contoh transformasi compiler yang benar-benar berguna, seperti closure atau async state machine. Perubahan kali ini juga serupa
Di C/C++, fakta bahwa
return 0default hanya berlaku dimain()juga terasa janggal dengan cara yang miripKalau hanya
mainyang diizinkan sebagai fungsi top-level sementara yang lain tidak, saya juga merasa ini bukan perubahan yang terlalu bagusSaya tidak mengerti kenapa baris
importsering dihilangkan dari contoh kode Java. Kalau tujuannya menunjukkan rumitnya boilerplate, seharusnyaimportjuga wajib ditulisBiasanya IDE mengelola
importsecara otomatis, jadi tidak terlalu dipikirkan. Untuk class terkait IO, dalam contoh compact tidak perluimportterpisah, jadi kode itu memang benar-benar jalan apa adanyaSebagian besar IDE Java mengelola
importsecara otomatisKalau entry point
public static void main(String[] args)diabstraksikan ke paradigma top-level statement seperti di C#, bukankah boilerplate bisa berkurang dan kodenya jadi lebih ringkas? Saya penasaran kenapa itu tidak dilakukanSilakan lihat dokumen Paving the on-ramp
Jika entry point ada sebagai kasus pengecualian yang spesial, itu sendiri sudah berarti mengakui batas OOP. Kalau begitu, mungkin lebih baik sekalian merancang alternatif baru yang lebih berani
Saya suka bahwa pendekatan unnamed class membuat implementasi variabel global jadi lebih mudah, hot reload juga dimungkinkan, dan sintaksnya lebih ringkas. Di sisi lain, file Java punya batasan bahwa namanya harus sama dengan
public class, jadi rasanyapublic class X { }saja sebenarnya bisa dijadikan opsional dan hanya ditulis saat diperlukan. Saya kurang paham kenapa harus memperkenalkan unnamed classCompiler tetap mengubahnya menjadi class seperti
HelloWorld.class, jadi nama itu hanya detail implementasi dan tidak bisa dipakai langsung di source codehttps://openjdk.org/jeps/445