<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java 變得越來越像 Rust?

          共 7358字,需瀏覽 15分鐘

           ·

          2024-04-11 23:20

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

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

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

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

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

          Immutable Data

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

          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 對象(又稱 POJO)在編寫時通常默認具有可變性,而且相當冗長。

          下面是它在 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,記錄類簡化了這一過程,并考慮到了不變性,我們的代碼也就不那么冗長了。下面是啟用了預覽功能的有效 Java 21 代碼。

          record User(String name, int age{}  

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

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

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

          在 Rust 中,這可以通過使用枚舉來實現(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)雅地實現(xiàn)這一點。不過,從 Java 21 及以后的版本開始,您可以使用包含記錄的密封接口和詳盡的開關(guān)語法在 Java 中優(yōu)雅地實現(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 永遠不會成為 Rust,但我很高興看到 Rust 的一些強大功能正在進入 Java。這將鞏固 Java 作為商業(yè)世界首選編程語言之一的長期地位。由于 OpenJDK 項目致力于提高開發(fā)人員的工作效率,Java 在過去 28 年中一直占據(jù)著重要的市場份額,即使不能在未來 28 年中重新奪回重要的市場份額,也有望保持這一地位。

          Python入門到精通
          Python入門到精通:人生苦短,我用Python!Python每日推送、Python教程、Python資料、Python視頻、Python項目、Python學習等。
          公眾號
          瀏覽 42
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产播放在线 | 亚州精品天堂中文字幕 | 黑人大屌与欧美成人视频 | 91美女在线观看 | 全国最大成人网站 |