1. Java 變得越來越像 Rust?

        共 7358字,需瀏覽 15分鐘

         ·

        2024-04-11 23:20

        架構(gòu)師大咖
        架構(gòu)師大咖,打造有價(jià)值的架構(gòu)師交流平臺(tái)。分享架構(gòu)師干貨、教程、課程、資訊。架構(gòu)師大咖,每日推送。
        公眾號(hào)

        隨著編程技術(shù)的增強(qiáng)和復(fù)雜性的提升,許多編程語言也紛紛效仿,Java 也不例外。

        另一邊,盡管社區(qū)內(nèi)部問題重重,但 Rust 仍逐年獲得開發(fā)人員的喜愛。這背后都是有原因的:Rust 的編譯器讓開發(fā)人員避免了各種問題。編譯器對(duì)正確性的要求讓一些開發(fā)人員開始感到不安全。

        我想展示兩個(gè) Rust 特性,它們是 Rust 優(yōu)秀之處的一部分,然后將它們與 Java 的最新創(chuàng)新進(jìn)行比較。

        免責(zé)聲明:我絕不是說這些 Rust 特性導(dǎo)致 Java 中出現(xiàn)了相應(yīng)的特性。如果是 Kotlin 或 Scala 在實(shí)現(xiàn)這些特性方面發(fā)揮了更大的作用,我也不會(huì)感到驚訝。但是,我很高興看到 Rust 的特性也能在(某種程度上)Java 中找到!

        Immutable Data

        在編程領(lǐng)域,Immutable Data 是指一種一旦創(chuàng)建就不能更改的數(shù)據(jù)結(jié)構(gòu)。在 Rust 中,數(shù)據(jù)默認(rèn)是不可變的。

        struct User {
            // struct members are immutable    
            name: &'static str,
            age:  i32
        }

        fn main() {  
            // user and members are immutable
            let user = User { name: "Bob", age: 42 };
        }  

        如果我們希望數(shù)據(jù)是可變的,就必須顯式聲明它是可變的。

        fn main() {
            let mut user = User { name: "Bob", age: 42 };
            user.name = "Jim";
        }  

        現(xiàn)在,普通的 Java 對(duì)象(又稱 POJO)在編寫時(shí)通常默認(rèn)具有可變性,而且相當(dāng)冗長。

        下面是它在 Java 8 中的樣子:

        public class User {  
            private String name;
            private int age;        

            public User(String name, int age{  
                this.name = name;        
                this.age = age;    
            }

            public String getName() {  
                return this.name;
            }

            public int getAge() {
                return this.age;
            }

            public void setName(String name{  
                this.name = name;
            }

            public void setAge(int age{  
                this.age = age;
            }

            public static void main(String[] args{  
                User user = new User("Bob"42);
                user.setName("Jim");
                System.out.println(user.getName());
            }

            // not to mention equals(), toString() and friends!  
        }  

        不過,多虧了現(xiàn)代 Java,記錄類簡化了這一過程,并考慮到了不變性,我們的代碼也就不那么冗長了。下面是啟用了預(yù)覽功能的有效 Java 21 代碼。

        record User(String name, int age{}  

        void main() {  
            final var user = new User("Bob"42);
        }  

        代數(shù)數(shù)據(jù)類型

        在這段視頻中,我們將看到 Rust 如何利用代數(shù)類型來幫助使無效狀態(tài)無法表示,并有力地保證不會(huì)出現(xiàn)錯(cuò)誤行為。

        在 Rust 中,這可以通過使用枚舉來實(shí)現(xiàn):

        enum RealCat {  
            Alive { is_hungry: bool },
            Dead
        }  

        fn main() {
            let real_cat: RealCat = RealCat::Alive { is_hungry: true };
            match real_cat {
                RealCat::Alive { is_hungry } => {
                    if is_hungry {
                        println!("The cat demands a sacrifice.");
                    } else {
                        println!("The cat is bored.");
                    }
                },
                RealCat::Dead => println!("Oh no!!!")
            }
        }

        直到最近,Java 仍無法優(yōu)雅地實(shí)現(xiàn)這一點(diǎn)。不過,從 Java 21 及以后的版本開始,您可以使用包含記錄的密封接口和詳盡的開關(guān)語法在 Java 中優(yōu)雅地實(shí)現(xiàn)這一功能:

        RealCat.java

        public sealed interface RealCat permits RealCat.AliveRealCat.Dead {

            record Alive(boolean isHungry) implements RealCat {}
            record Dead() implements RealCat {}

            static void check(RealCat realCat) {
                switch (realCat) {
                    case Alive aliveCat -> {
                        if (aliveCat.isHungry()) {
                            System.out.println("The cat demands a sacrifice.");
                        } else {
                            System.out.println("The cat is bored.");
                        }
                    }
                    case Dead _ -> System.out.println("Oh no!!!");
                }
            }
        }

        RealCatApplication.java

        void main() {
            final var hungryCat = new RealCat.Alive(true);
            RealCat.check(hungryCat);
        }

        結(jié)論

        有無數(shù)理由表明 Java 永遠(yuǎn)不會(huì)成為 Rust,但我很高興看到 Rust 的一些強(qiáng)大功能正在進(jìn)入 Java。這將鞏固 Java 作為商業(yè)世界首選編程語言之一的長期地位。由于 OpenJDK 項(xiàng)目致力于提高開發(fā)人員的工作效率,Java 在過去 28 年中一直占據(jù)著重要的市場份額,即使不能在未來 28 年中重新奪回重要的市場份額,也有望保持這一地位。

        Python入門到精通
        Python入門到精通:人生苦短,我用Python!Python每日推送、Python教程、Python資料、Python視頻、Python項(xiàng)目、Python學(xué)習(xí)等。
        公眾號(hào)
        瀏覽 42
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 大香蕉伊人手机在线 | 亚洲一级黄片免费看 | 亚洲精品乱码久久久久蜜桃网站 | 久久www免费人成看片好看吗 | 毛片手机在线免费观看 |