Java 變得越來越像 Rust?
隨著編程技術(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!
}
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!!!")
}
}
RealCat.java
public sealed interface RealCat permits RealCat.Alive, RealCat.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 年中重新奪回重要的市場份額,也有望保持這一地位。
