JavaRush /Blog Jawa /Random-JV /Ngopi #37. Masa depan anyar kanggo Jawa. JVM, Kotlin lan ...

Ngopi #37. Masa depan anyar kanggo Jawa. JVM, Kotlin lan prospek Jawa sawise 2020

Diterbitake ing grup
Sumber: Jawa Sedheng utamane dikritik amarga rong perkara: verbositas lan jumlah kode boilerplate sing digawe ing pirang-pirang kasus tanpa perlu. Senajan aku wis seneng basa Jawa, aku ora bisa ngomong yen statements iki salah. Pancen bener: rincian sing berlebihan ing basa Jawa kadhangkala bisa banget ngganggu. Nanging, kita kudu ngakoni manawa kita ora manggon ing donya sing becik, lan ing pirang-pirang kasus kita kudu milih sing luwih cilik saka rong piala. Ngopi #37.  Masa depan anyar kanggo Jawa.  JVM, Kotlin lan prospek Jawa sawise 2020 - 1Wiwit wiwitane, Jawa durung sampurna: kita kabeh ngerti iki, nanging pitakonan sing bener yaiku kenapa ora ana sing ditindakake sadurunge kanggo ngrampungake masalah kasebut. Aku mung mikir yen owah-owahan kasebut suwe banget amarga basa Jawa kurang saingan lan kahanane kaya ngono. Jawa ndominasi pasar, mbokmenawa amarga lack of saingan serius lan gedhe efforts digawe pisanan dening Sun lan banjur dening Oracle. Tingkat keamanan jinis sing dhuwur sing diwenehake Jawa lan struktur basa sing apik wis dadi populer banget kanggo proyek gedhe. Kajaba iku, iku basa multi-platform sing mlaku ing mesin virtual dhewe. Digabungake karo optimasi kinerja otomatis liwat compiler JIT, kabeh iki nyilikake impact saka kode kurang ditulis. Kabeh ing kabeh, iku pesawat cukup milutaken saka alasan kanggo nggunakake Jawa. Nanging apa sing kedadeyan sabanjure? Apa sing kedadeyan yaiku basa anyar wis teka ing pasar sing bisa mlaku ing JVM sing padha karo Jawa. Basa sing ngilangi sawetara rasa ora nyaman paling gedhe ing Jawa lan, ing sawetara kasus, nawakake pangembang lingkungan sing luwih nyenengake kanthi alangan sing luwih murah kanggo mlebu. Sakdurunge nerusake, ayo goleki lan deleng sejarah basa JVM.

Sajarah basa JVM

Kaping pisanan, aku pengin nerangake siji perkara: Aku ora nyebutake sawetara basa JVM sing ana amarga ora duwe dhukungan sing cukup kanggo dianggep minangka calon sing digunakake ing industri kita. Ayo kita miwiti ringkesan ringkes babagan sejarah basa JVM. Kaping pisanan, kita bakal duwe Java, basa paling tuwa lan paling populer ing jagad JVM. Jawa resmi dirilis ing Januari 1996, mula basa iki wis ana 24 taun. Ora ala, ta? Jawa asline minangka basa imperatif murni sing ngetutake gaya pemrograman berorientasi obyek; iku uga basa banget diketik. Sintaks Jawa meh padha karo basa C++ lan C, nanging dianggep minangka versi sing luwih apik amarga nulis kode ing Jawa luwih gampang tinimbang ing C utawa C++. Ing sisih liya, kita duwe argumentasi paling gedhe ing antarane para detractors - verbosity. Basa JVM kapindho yaiku Groovy. Iki wis ana wiwit taun 2003, sanajan versi standar pisanan, 1.0, mung muncul ing Januari 2007. Kauntungan saka Groovy yaiku bisa digunakake minangka basa skrip. Groovy minangka basa sing diketik kanthi dinamis, mula mriksa jinis ditindakake nalika runtime. Iki minangka salah sawijining sebab sawetara pangembang ora seneng karo Groovy. Sampeyan nulis kode sampeyan ing Groovy lan katon bener nalika kompilasi, nanging nalika runtime sampeyan ngerti ana sing salah. Banjur muncul basa populer liyane: kita ngomong babagan Scala. Iki dirilis ing taun 2004. Dheweke nggawa model kerja anyar menyang jagad JVM: pemrograman fungsional lan pendekatan deklaratif. Sejatine, Scala minangka basa pisanan sing ngenalake konsep immutability, sing banjur digunakake kanggo nambah Jawa. Ing tangan liyane, detractors ora seneng Scala amarga grammar sawijining Komplek lan rada kurang maca. Basa sabanjure sing metu saka jagad JVM yaiku Clojure, basa sing mung fungsional. Wis dadi populer bubar, sanajan muncul ing taun 2007. Clojure minangka basa adhedhasar LISP sing ditondoi kanthi gamblang lan nggunakake fungsi sing prasaja. Antarane kekurangane yaiku diketik kanthi dinamis (kaya Groovy) lan kurva sinau luwih curam amarga sintaksis kasebut beda banget karo basa JVM liyane. Lan pungkasane, kita duwe Kotlin. Kotlin pisanan muncul ing Februari 2016, lan wiwit iku popularitasé ora mandheg. Iki dikembangake dening JetBrains kanthi tujuan utama: kanggo ndandani masalah Jawa sing paling misuwur. Miturut rancangan, Kotlin nahan kabeh kaluwihan Jawa, nanging ing wektu sing padha wis ngrampungake akeh masalah. Iki minangka basa JVM sing paling penting. Kaya sing dakkandhakake, kita ora kejawab sawetara basa liyane sing ora populer: Jython, JRuby, Ceylon, Fantom, lsp. Yen sampeyan pengin, sampeyan bisa ngerteni kabeh dhaptar basa JVM sing anaing Wikipedia. Sampeyan mbokmenawa wis ngerti yen Jawa ora duwe saingan akeh ing wolung utawa sepuluh taun pisanan sawise digawe, nanging wiwit iku wis owah. Dadi, kompetisi apik utawa ala?

Keuntungan saka Tambah Kompetisi

Jawa durung owah akeh ing wiwitane. Mbokmenawa amarga ora perlu. Basa iki wis akeh digunakake lan tansah populer banget, sanajan kasunyatane adoh saka sampurna. Nanging banjur muncul saingan, basa sing luwih modern sing nyedhiyakake fitur-fitur anyar lan ngrampungake sawetara masalah sing wis suwe ngganggu pangembang Jawa. Contone, ayo dideleng ing basa Scala. Popularitas Scala saya tambah wiwit taun 2009. Pangembang nampani gaya fungsional anyar iki, sing menehi keluwesan sing luwih gedhe uga kemampuan kanggo nulis kode paralel kanthi aman lan gampang. Kepiye Oracle nanggapi tren anyar iki? Ing 2014, Java Lambdas lan Streams muncul. Aku kabeh bisa setuju yen iki nalika Jawa njupuk langkah paling gedhe kanggo ngalahake Scala. Saiki programer apa wae sing ngerti yen Scala wis ora trendi maneh. Ngopi #37.  Masa depan anyar kanggo Jawa.  JVM, Kotlin lan prospek Jawa sawise 2020 - 2Manfaat liyane kanggo nduwe pesaing liyane ing jagad JVM yaiku perbaikan terus-terusan ing kompiler JIT lan JVM. Saiki luwih akeh wong sing kepengin ngoptimalake JVM lan ningkatake kinerja. Dadi kompetisi apik kanggo kabeh wong! Alternatif paling anyar kanggo Jawa yaiku basa Kotlin. Penampilan kasebut penting banget kanggo pangembangan Jawa, amarga basa anyar kasebut, kanthi cara, nuduhake Oracle cara maju. Conto Kotlin nuduhake manawa bisa njaga kaluwihan Jawa, nanging nggawe basa sing luwih kompak sing luwih cepet nulis kode. Yen sampeyan ndeleng grafik Google Trends, sampeyan bisa ndeleng manawa saka 2016 nganti 2018, popularitas Kotlin tansaya cepet. Nanging sajrone rong taun kepungkur, kasenengan kasebut mudhun. Ngopi #37.  Masa depan anyar kanggo Jawa.  Prospek JVM, Kotlin lan Java sawise 2020 - 3Oracle wis nliti respon industri marang Kotlin. Yen katon ing cathetan release JDK 15 , sampeyan bakal weruh sing sawetara fitur Jawa anyar salinan saka apa sing teka ing Kotlin. Iki minangka entri Jawa anyar , blok teks anyar (string multiline kanthi kuotasi telung) lan operator anyar switch, sing sejatine minangka salinan operator whening Kotlin. Kabeh sing dakkandhakake yaiku "Kotlinisasi Jawa." Kanthi dadi pesaing sing luwih kuwat, Kotlin nuduhake dalan sing kudu ditindakake Jawa.

"Kotlinisasi" Jawa

Sawetara fitur Jawa sing bakal teka bakal dadi dandan sing signifikan babagan keterbacaan lan bakal ngatasi salah sawijining kelemahane basa Jawa sing paling gedhe - verbosity. Siji bisa mbantah manawa akeh fitur Jawa sing diumumake meh padha karo sawetara fitur Kotlin. Nanging elinga manawa umume yaiku versi pra-rilis . Iki tegese yen sampeyan nginstal JDK 14 utawa JDK 15 (nalika dirilis), sampeyan ora bakal bisa nggunakake minangka standar. Pratinjau fitur Jawa minangka fitur anyar sing diluncurake ing rilis nanging dipateni kanthi standar. Iki kalebu ing versi anyar mung kanggo ngumpulake umpan balik saka komunitas pangembang, saengga bisa uga bisa diganti. Mulane ora dianjurake kanggo nggunakake ing kode produksi. Kanggo ngaktifake wektu kompilasi, sampeyan kudu nindakake ing ngisor iki:
javac --enable-preview --release 14
Yen sampeyan pengin ngaktifake ing runtime, sampeyan kudu mbukak ing ngisor iki:
java --enable-preview YourClass
Mesthi, sampeyan uga bisa ngaktifake ing IDE, nanging ati-ati supaya ora ngaktifake pratinjau kanthi gawan ing kabeh proyek anyar! Ayo deleng owah-owahan sing bakal duwe pengaruh sing luwih gedhe marang coding ing versi Java sing bakal teka.

Tulisan Jawa

Java Records minangka fitur sing wis suwe banget kita nggumunake. Aku ngira sampeyan wis nemokake dhewe ing kahanan sing sampeyan kudu ngleksanakake toString , hashCode , equals , uga getter kanggo saben lapangan sing ana. Kotlin nduweni kelas data kanggo ngatasi masalah iki , lan Jawa arep nindakake perkara sing padha kanthi ngeculake kelas rekaman sing wis diduweni Scala arupa kelas kasus . Tujuan utama kelas kasebut yaiku kanggo nyimpen data sing ora bisa diganti ing obyek. Ayo njupuk conto kanggo ndeleng carane Jawa bisa dadi luwih apik. Iki jumlah kode sing kudu kita tulis kanggo nggawe lan mbandhingake kelas kita Employee:
package com.theboreddev.java14;

import java.util.Objects;

public class Employee {
    private final String firstName;
    private final String surname;
    private final int age;
    private final Address address;
    private final double salary;

    public Employee(String firstName, String surname, int age, Address address, double salary) {
        this.firstName = firstName;
        this.surname = surname;
        this.age = age;
        this.address = address;
        this.salary = salary;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getSurname() {
        return surname;
    }

    public int getAge() {
        return age;
    }

    public Address getAddress() {
        return address;
    }

    public double getSalary() {
        return salary;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Employee employee = (Employee) o;
        return age == employee.age &&
                Double.compare(employee.salary, salary) == 0 &&
                Objects.equals(firstName, employee.firstName) &&
                Objects.equals(surname, employee.surname) &&
                Objects.equals(address, employee.address);
    }

    @Override
    public int hashCode() {
        return Objects.hash(firstName, surname, age, address, salary);
    }

    @Override
    public String toString() {
        return "Employee{" +
                "firstName='" + firstName + '\'' +
                ", surname='" + surname + '\'' +
                ", age=" + age +
                ", address=" + address +
                ", salary=" + salary +
                '}';
    }
}
Lan uga obyek Addresssing ngemot:
import java.util.Objects;

public class Address {
    private final String firstLine;
    private final String secondLine;
    private final String postCode;

    public Address(String firstLine, String secondLine, String postCode) {
        this.firstLine = firstLine;
        this.secondLine = secondLine;
        this.postCode = postCode;
    }

    public String getFirstLine() {
        return firstLine;
    }

    public String getSecondLine() {
        return secondLine;
    }

    public String getPostCode() {
        return postCode;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Address address = (Address) o;
        return Objects.equals(firstLine, address.firstLine) &&
                Objects.equals(secondLine, address.secondLine) &&
                Objects.equals(postCode, address.postCode);
    }

    @Override
    public int hashCode() {
        return Objects.hash(firstLine, secondLine, postCode);
    }

    @Override
    public String toString() {
        return "Address{" +
                "firstLine='" + firstLine + '\'' +
                ", secondLine='" + secondLine + '\'' +
                ", postCode='" + postCode + '\'' +
                '}';
    }
}
Ana mbokmenawa kakehan kode kanggo soko supaya prasaja, tengen? Ayo saiki ndeleng carane iki bakal katon karo entri Jawa anyar:
public record EmployeeRecord(String firstName, String surname, int age, AddressRecord address, double salary) {
}
Lan aja lali kelas Alamat:
public record AddressRecord(String firstLine, String secondLine, String postCode) {
}
Iki bab sing padha kita wrote sadurungé karo supaya akeh kode. Setuju: iki apik tenan. Lan jumlah kode sing bakal disimpen, lan gampang nulis! Ayo saiki ndeleng apa bedane karo operator anyar switch.

Apik Operatorswitch

Operator anyar switching Jawa bakal ngrampungake sawetara masalah lawas, kalebu sawetara bug lan duplikasi kode. Kanthi operator anyar switchmasalah iki bakal ditanggulangi. Kanggo nerangake iki nganggo conto, kita bakal nggawe enum DayOfTheWeeking Jawa:
public enum DayOfTheWeek {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}
Sawise iku, kita switchbakal menehi katrangan babagan posisi ing minggu sing cocog karo dina kasebut. Ayo ndeleng kepiye carane nindakake iki saiki nggunakake Java 11.
final DayOfTheWeek dayOfTheWeek = DayOfTheWeek.THURSDAY;

        int position = 0;

        switch (dayOfTheWeek) {
            case MONDAY:
                position = 1;
                break;
            case TUESDAY:
                position = 2;
                break;
            case WEDNESDAY:
                position = 3;
                break;
            case THURSDAY:
                position = 4;
                break;
            case FRIDAY:
                position = 5;
                break;
            case SATURDAY:
                position = 6;
                break;
            case SUNDAY:
                position = 7;
                break;
        }

        System.out.println("Day " + dayOfTheWeek + " is in position " + position + " of the week");
Kanthi statement saiki, switchkita kudu nggunakake variabel, lan yen kita kantun salah siji saka dina minggu, kode kita bakal kompilasi apik. Iki minangka salah sawijining masalah karo operator switch: padha banget rawan kesalahan. Dadi, kepiye carane Java 14 nambah? Ayo dideleng:
final DayOfTheWeek dayOfTheWeek = DayOfTheWeek.THURSDAY;

        int position = switch (dayOfTheWeek) {
            case MONDAY -> 1;
            case TUESDAY -> 2;
            case WEDNESDAY -> 3;
            case THURSDAY -> 4;
            case FRIDAY -> 5;
            case SATURDAY -> 6;
            case SUNDAY -> 7;
        };

        System.out.println("Day " + dayOfTheWeek + " is in position " + position + " of the week");
Minangka sampeyan bisa ndeleng, operator anyar switchbisa digunakake minangka ekspresi, ora mung minangka statement. Asil luwih ringkes lan ekspresif. Iki bakal cukup kanggo gawe uwong yakin akeh kita nggunakake, nanging salah siji saka dandan utama iku saiki statements switchora bakal ngumpulake kajaba kita nutupi kabeh kasus ing kita switch. Iki bakal nuduhake kesalahan iki, contone:
Error:(9, 24) java: the switch expression does not cover all possible input values
Wiwit saiki, ora mungkin nglewati kasus ing operator kita switch. Iki meh padha karo operator whening Kotlin, sing bisa diwaca ing dokumentasi . Ayo uga ndeleng blok teks anyar.

Blok teks

Apa sampeyan tau ngeluh babagan carane angel nemtokake gumpalan JSON menyang variabel ing Jawa? Jawa nduweni urutan multiline sing bisa dijlentrehake kanthi nyakup ing kuotasi telung. Sawise fitur iki resmi dirilis, bakal dadi luwih gampang kanggo njlèntrèhaké urutan dawa liwat sawetara baris. Ayo katon ing beda antarane rong mode. Yen kita pengin nggunakake format JSON ing variabel, ternyata ala:
final String text = "{\"widget\": {\n" +
                "    \"debug\": \"on\",\n" +
                "    \"window\": {\n" +
                "        \"title\": \"Sample Konfabulator Widget\",\n" +
                "        \"name\": \"main_window\",\n" +
                "        \"width\": 500,\n" +
                "        \"height\": 500\n" +
                "    },\n" +
                "    \"image\": { \n" +
                "        \"src\": \"Images/Sun.png\",\n" +
                "        \"name\": \"sun1\",\n" +
                "        \"hOffset\": 250,\n" +
                "        \"vOffset\": 250,\n" +
                "        \"alignment\": \"center\"\n" +
                "    },\n" +
                "    \"text\": {\n" +
                "        \"data\": \"Click Here\",\n" +
                "        \"size\": 36,\n" +
                "        \"style\": \"bold\",\n" +
                "        \"name\": \"text1\",\n" +
                "        \"hOffset\": 250,\n" +
                "        \"vOffset\": 100,\n" +
                "        \"alignment\": \"center\",\n" +
                "        \"onMouseUp\": \"sun1.opacity = (sun1.opacity / 100) * 90;\"\n" +
                "    }\n" +
                "}} ";
Ing sisih liya, nalika blok teks anyar dirilis, kabeh bakal dadi luwih gampang:
final String multiLineText = """
                {"widget": {
                    "debug": "on",
                    "window": {
                        "title": "Sample Konfabulator Widget",
                        "name": "main_window",
                        "width": 500,
                        "height": 500
                    },
                    "image": {\s
                        "src": "Images/Sun.png",
                        "name": "sun1",
                        "hOffset": 250,
                        "vOffset": 250,
                        "alignment": "center"
                    },
                    "text": {
                        "data": "Click Here",
                        "size": 36,
                        "style": "bold",
                        "name": "text1",
                        "hOffset": 250,
                        "vOffset": 100,
                        "alignment": "center",
                        "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
                    }
                }}
                """;
Iki mesthi katon luwih apik. Kabeh iki wis didhukung ing Kotlin, kaya sing sampeyan deleng ing definisi jinise . Dadi kita wis weruh yen Jawa "marisi" akeh solusi kanggo masalah dhewe saka salah sawijining pesaing: Kotlin. Kita ora ngerti apa Oracle nanggapi ing wektu kanggo nglawan kebangkitan Kotlin utawa yen wis telat. Secara pribadi, aku yakin manawa Jawa nggawe langkah sing bener, sanajan owah-owahan kasebut diwiwiti dening pesaing lan bisa uga ana wektu tundha.

Kesimpulan

Dak anggep sayembara iku sing paling apik sing tau ana ing basa Jawa. Pangrasaku, yen ora, Jawa bakal leren. Kajaba iku, saingan Jawa wis nuduhake manawa ana cara pemrograman sing beda-beda, nuduhake carane maju lan ngindhari cara nulis kode sing wis lawas lan ora efisien. Owah-owahan ing mangsa ngarep bakal ndadekake Jawa luwih kuat tinimbang sadurunge, basa sing dicocogake karo jaman modern, basa sing pengin berkembang.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION