17 poin oleh GN⁺ 2025-09-18 | 5 komentar | Bagikan ke WhatsApp
  • 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 main yang 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

 
kayws426 2025-09-22

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?

 
jhk0530 2025-09-19

Wow

 
jwh926 2025-09-18

Harus belajar Java lagi ya..

 
carnoxen 2025-09-18

main sudah mati. Hidup main!

 
GN⁺ 2025-09-18
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 void atau String[], jadi terasa menarik. Setelah belajar tipe, saya mulai paham, lalu setelah itu saya mengerti konsep class dan object, serta kenapa main ada 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 lega

    • Memang 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 Scanner masih terasa asing karena saya baru pertama kali melihatnya

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String input = in.readLine();
  • Pengalaman saya juga mirip. Karena dulu lama memakai Java, pola public static void main sudah terasa akrab, tetapi cara memakai Scanner justru terasa janggal sehingga saya tidak benar-benar paham alasannya

  • Dalam pengalaman saya, karena sudah puluhan tahun bekerja di proyek besar, bagaimana fungsi main ditulis sama sekali tidak memengaruhi keseharian atau karier saya. Saya penasaran seberapa besar perubahan seperti ini benar-benar berdampak bagi kalian

    • Kalau 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 tidak

    • Banyak orang masuk ke dunia pemrograman lewat Java dan mengetik main puluhan kali, tetapi sama sekali tidak tahu apa artinya

    • Bagi 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 main di codebase. Dan alih-alih membuat class baru sendiri, biasanya bentuknya lebih sering mengimplementasikan atau mewarisi class yang spesifik ke framework

  • JEP 445: Unnamed Classes and Instance Main Methods dirilis di Java 21
    https://openjdk.org/jeps/445

    • Sayangnya, fitur ini dirilis hanya agar bisa dipakai untuk program file tunggal. Seandainya method level package atau beberapa class/record dalam satu file juga diizinkan, Java mungkin akan terasa lebih baik. Tapi bagaimanapun juga, tampaknya mereka memang tidak ingin fitur ini "berdampak pada cara umum penulisan kode Java"
  • 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 konsisten

    • Sintaks 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 0 default hanya berlaku di main() juga terasa janggal dengan cara yang mirip

    • Kalau hanya main yang diizinkan sebagai fungsi top-level sementara yang lain tidak, saya juga merasa ini bukan perubahan yang terlalu bagus

  • Saya tidak mengerti kenapa baris import sering dihilangkan dari contoh kode Java. Kalau tujuannya menunjukkan rumitnya boilerplate, seharusnya import juga wajib ditulis

    • Biasanya IDE mengelola import secara otomatis, jadi tidak terlalu dipikirkan. Untuk class terkait IO, dalam contoh compact tidak perlu import terpisah, jadi kode itu memang benar-benar jalan apa adanya

    • Sebagian besar IDE Java mengelola import secara otomatis

  • Kalau 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 dilakukan

    • Silakan 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 rasanya public class X { } saja sebenarnya bisa dijadikan opsional dan hanya ditulis saat diperlukan. Saya kurang paham kenapa harus memperkenalkan unnamed class
    Compiler tetap mengubahnya menjadi class seperti HelloWorld.class, jadi nama itu hanya detail implementasi dan tidak bisa dipakai langsung di source code
    https://openjdk.org/jeps/445