Java 变得越来越像 Rust?

随着编程技术的增强和复杂性的提升,许多编程语言也纷纷效仿,Java 也不例外。

另一边,尽管社区内部问题重重,但 Rust 仍逐年获得开发人员的喜爱。这背后都是有原因的:Rust 的编译器让开发人员避免了各种问题。编译器对正确性的要求让一些开发人员开始感到不安全。

我想展示两个 Rust 特性,它们是 Rust 优秀之处的一部分,然后将它们与 Java 的最新创新进行比较。

免责声明:我绝不是说这些 Rust 特性导致 Java 中出现了相应的特性。如果是 Kotlin 或 Scala 在实现这些特性方面发挥了更大的作用,我也不会感到惊讶。但是,我很高兴看到 Rust 的特性也能在(某种程度上)Java 中找到!

图片

Immutable Data

在编程领域,Immutable Data 是指一种一旦创建就不能更改的数据结构。在 Rust 中,数据默认是不可变的。

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 };
}  

如果我们希望数据是可变的,就必须显式声明它是可变的。

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

现在,普通的 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!  
}  

不过,多亏了现代 Java,记录类简化了这一过程,并考虑到了不变性,我们的代码也就不那么冗长了。下面是启用了预览功能的有效 Java 21 代码。

record User(String name, int age) {}  

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

图片

代数数据类型

在这段视频中,我们将看到 Rust 如何利用代数类型来帮助使无效状态无法表示,并有力地保证不会出现错误行为。

在 Rust 中,这可以通过使用枚举来实现:

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 仍无法优雅地实现这一点。不过,从 Java 21 及以后的版本开始,您可以使用包含记录的密封接口和详尽的开关语法在 Java 中优雅地实现这一功能:

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);
}

图片

结论

有无数理由表明 Java 永远不会成为 Rust,但我很高兴看到 Rust 的一些强大功能正在进入 Java。这将巩固 Java 作为商业世界首选编程语言之一的长期地位。由于 OpenJDK 项目致力于提高开发人员的工作效率,Java 在过去 28 年中一直占据着重要的市场份额,即使不能在未来 28 年中重新夺回重要的市场份额,也有望保持这一地位。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GlobalMapper精品教程】074:从Lidar点云创建3D地形模型

本文基于地形点云数据,基于泊松方法、贪婪三角形测量方法和阿尔法形状创建3d地形模型。 文章目录 一、加载地形点云数据二、创建三维地形模型1. 泊松方法2. 贪婪三角形测量方法3. 阿尔法形状注意事项一、加载地形点云数据 加载配套案例数据包中的data074.rar中的地形点云数据…

3D地图大屏 附源码(Three.js + Vue3)

目录 👋 前言 🚀 项目包 ⚒️ 字体制作 🌐 地图制作 💡 参考视频 & 项目 开源项目(Vue3tsWindcssEchartThree.js大屏案例) 开源(教程) UI风格学习( www.shuzixs.com …

java调用讯飞星火认知模型

前往讯飞开发平台选择产品,获取appId、apiKey、APISecret,这里我选择的是v3.0模型。 java后端实现 本项目以及实现了基本的会话功能,小伙伴可以自己扩充其他的例如绘画功能。 注意:星火模型的api使用的是websocket协议&#xf…

c 多文件编程

1.结构目录 声明类:用于声明方法,方便方法管理和调用; 实现类:用于实现声明的方法; 应用层:调用方法使用 写过java代码的兄弟们可以这么理解: 声明类 为service层 实现类 为serviceimpl层 应用层 为conlloter层 2.Dome 把函数声明放在头文件xxx.h中&…

与上级意见不合时如何恰当地表达自己的观点?

在工作中与上级意见不合时,恰当表达自己的观点并寻求共识是一个需要谨慎处理的问题。以下是一些建议: 1. **尊重与礼貌**:在任何情况下,都应保持对上级的尊重和礼貌。即使在意见不合时,也要避免情绪化,保持…

200页图解国标《数据分类分级规则》正式稿,强化重要数据识别

GB/T 43697-2024《数据安全技术 数据分类分级规则》正式稿发布,并于2024年10月1日实施。2024年4月17日,国家标准全文公开系统公布了国标最终版。《数据分类分级规则》是全国网安标委更名后,发布的第一部以“数据安全技术”命名的国家标准&…

Python-VBA函数之旅-enumerate函数

目录 1、enumerate函数: 1-1、Python: 1-2、VBA: 2、相关文章: 个人主页:非风V非雨-CSDN博客 enumerate函数在Python中是一个强大的内置函数,用于将一个可迭代对象转换为一个索引序列,同时返…

java-spring 图灵 04 doscan

01.本次的重点依旧是扫描函数,这次是spring中的源码: 02.第一步,构造AnnotationConfigApplicationContext 主方法: public static void main(String[] args) {// 创建一个Spring容器AnnotationConfigApplicationContext applica…

C#基础|Debug程序调试学习和技巧总结

哈喽,你好啊,我是雷工! 在程序的开发过程中,可能绝大部分时间是用来调试程序, 当完成了某个功能的编程,都需要调试一下程序,看编程是否存在问题。 01 为什么需要程序调试 无论是电气工程师还…

深入探究图像增强(C语言实现)

我们将从基础出发使用C语言进行图像处理与分析,重点讨论图像增强和平滑技术。图像增强技术旨在通过增加对比度、亮度和整体清晰度来改善图像的视觉质量。另一方面,图像平滑方法则用于减少噪声并减少图像中的突变,使图像更加均匀和视觉上吸引人…

2024新版淘宝客PHP网站源码

源码介绍 2024超好看的淘客PHP网站源码,可以做优惠券网站,上传服务器,访问首页进行安装 安装好了之后就可以使用了,将里面的信息配置成自己的就行 喜欢的朋友们拿去使用把 效果截图 源码下载 2024新版淘宝客网站源码

高精度算法(1)

前言 今天来讲一讲高精度算法,我们说一个数据类型,有它的对应范围比如int类型最多 可以包含到负2的31次方到2的31次方减一 其实大概就是20亿左右那么其他的类型也同样如此 那么,如何解决一个很大很大的数的运算呢? 我们今天介…

OSPF综合大实验

1、R4为ISP,其上只配置IP地址;R4与其他所直连设备间均使用公有IP; 2、R3-R5、R6、R7为MGRE环境,R3为中心站点; 3、整个OSPF环境IP基于172.16.0.0/16划分;除了R12有两个环回,其他路由器均有一个环…

局域网管理软件,适合在局域网内的管理软件有哪些?

信息技术的不断发展,局域网在企业、学校等机构中得到了广泛应用。 局域网不仅能够提高数据传输效率,还能实现资源共享和协同工作。 为了更好地管理和维护局域网,需要使用一些专业的局域网管理软件。 一、局域网的应用范围 局域网&#xff…

【算法一则】分隔链表

题目 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1: 输入:head [1,4,3,2,5,2], x …

做一个图像分类任务(一)准备数据集

文章目录 环境准备准备数据集爬取数据代码删除多余的文件fruit81水果数据图像分类数据集下载统计图像的尺寸和比例分布代码划分训练集和数据集代码可视化图像代码统计各类别的数量 环境准备 推荐按照原作者推荐的环境:代码测试云GPU环境:GPU RTX 3060、…

如何安全、高速、有效地利用IP代理爬取数据

陈老老老板🧙‍♂️ 👮‍♂️本文专栏:生活(主要讲一下自己生活相关的内容)生活就像海洋,只有意志坚强的人,才能到达彼岸。 🤴本文简述:如何安全、高速、有效地利用IP代理爬取数据 &#x1f473…

多模态AnyGPT——整合图像、语音和文本多模态大规模语言模型算法原理与实践

概述 大规模语言模型在理解和生成人类语言方面具有非凡的能力,但迄今为止,它们的能力主要局限于文本处理。然而,现实世界是一个多模式的环境,信息通过视觉、听觉和触觉等多种感官进行交换。融入这种多样性是开发下一代系统的主要…

云原生Kubernetes: K8S 1.29版本 部署Jenkins

目录 一、实验 1.环境 2.K8S 1.29版本 部署Jenkins 服务 3.jenkins安装Kubernetes插件 二、问题 1.创建pod失败 2.journalctl如何查看日志信息 2.容器内如何查询jenkins初始密码 3.jenkins离线安装中文包报错 4.jenkins插件报错 一、实验 1.环境 (1&…

上位机图像处理和嵌入式模块部署(树莓派4b固件功能设计)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们说过,上位机的功能都是基于插件进行开发的。但是上位机的成本比较贵,一般的企业不一定愿意接接受。这个时候另外一…