当前位置: 首页 > news >正文

Java 变得越来越像 Rust

Java 变得越来越像 Rust

介绍

随着编程的增强和复杂性越来越流行,许多编程语言也相互效仿。 Java 也不例外。

尽管社区内部存在问题,Rust 仍逐年赢得了开发人员的喜爱。并且有充分的理由:由于编译器,Rust 使开发人员能够避免整个类别的问题。编译器要求正确性,以至于一些开发人员开始遇到一些不安全感。

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

免责声明:我绝不声称这些 Rust 功能导致其对应功能出现在 Java 中。如果 Kotlin 和或 Scala 在实现这一点方面更具影响力,我不会感到惊讶。但我很高兴看到 Rust 功能也可以(在某种程度上)在 Java 中找到!

不可变数据(Immutable Data)

在 Rust 中,数据默认是不可变的。

struct User {// struct members are immutable    name: &'static str,age:  i32
}fn main() {  // user and members are immutablelet 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,record 类在考虑到不变性的情况下简化了这一点,并且我们的代码远没有那么冗长。以下是启用了预览的有效 Java 21 代码。

record User(String name, int age) {}  void main() {  final var user = new User("Bob", 42);
}  

代数数据类型(Algebraic Data Types)

在这段 YouTube 视频中,我们看到 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 及更高版本开始,您可以使用包含记录的密封接口并使用详尽的 switch 语法在 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 作为商业世界首选编程语言之一的长期地位。 Java 在过去 28 年中一直拥有重要的市场份额,并且由于 OpenJDK 项目致力于提高开发人员的生产力,因此在未来 28 年中即使不能重新获得重要的市场份额,也有望保持这一市场份额。

相关文章:

Java 变得越来越像 Rust

Java 变得越来越像 Rust 介绍 随着编程的增强和复杂性越来越流行,许多编程语言也相互效仿。 Java 也不例外。 尽管社区内部存在问题,Rust 仍逐年赢得了开发人员的喜爱。并且有充分的理由:由于编译器,Rust 使开发人员能够避免整…...

通过git bash 或命令行ssh访问服务器 sftp上传下载文件

上传下载文件 sftp -P 端口 appywIP 示例:sftp -P 10022 appyw25.222.133.222 然后输入密码即可 ls 查看文件 lls 查看本地文件 cd 跳转 lcd 本地跳转 get ... 下载文件 put 本地文件名 远程文件夹 //上传文件 put -r 本地文件夹 远程文件夹 //上传文件夹服务器…...

27 OpenCV 凸包

文章目录 概念Graham扫描算法convexHull 凸包函数示例 概念 什么是凸包(Convex Hull),在一个多变形边缘或者内部任意两个点的连线都包含在多边形边界或者内部。 正式定义: 包含点集合S中所有点的最小凸多边形称为凸包 Graham扫描算法 首先选择Y方向最低…...

【GPT概念04】仅解码器(only decode)模型的解码策略

一、说明 在我之前的博客中,我们研究了关于生成式预训练转换器的整个概述,以及一篇关于生成式预训练转换器(GPT)的博客——预训练、微调和不同的用例应用。现在让我们看看所有仅解码器模型的解码策略是什么。 二、解码策略 在之前…...

蔚来-安全开发一面/二面

基本不怎么会渗透测试,本科期间有过大数据隐私保护(密码)的项目,硕士期间有个华为合作的项目一篇在投的ai安全论文 一面(45min) 1.介绍自己 2.介绍一下实习 3.场景题轰炸,主要针对实习中的场景,主要考察…...

Redis Cluster集群模式容器化部署

Redis Cluster集群模式容器化部署 安装Docker和docker-compose准备docker-compose文件准备Redis配置文件Linux内核参数优化启停Redis实例Redis集群搭建 环境准备: IP版本角色端口172.x.x.11RHEL 7.9master6379172.x.x.12RHEL 7.9master6379172.x.x.13RHEL 7.9maste…...

网络原理(6)——IP协议

目录 一、网段划分 现在的网络划分: 1、一般情况下的家庭网络环境 2、IP地址 3、子网掩码 4、网关 以前的网络划分: 二、特殊IP 1、环回 IP 2、主机号为全 0 的IP 3、广播地址IP 三、路由选择(路线规划) 一、网段划分…...

淘宝商品详情API接口:快速获取商品信息的高效工具

淘宝商品详情API接口:快速获取商品信息的高效工具 请求示例,API接口接入Anzexi58 在信息化、数字化的今天,数据已成为商业决策的重要依据。对于电商行业而言,快速准确地获取商品信息对于商家和消费者都至关重要。淘宝作为中国最大…...

一分钟学习Markdown语法

title: 一分钟学习Markdown语法 date: 2024/3/24 19:33:29 updated: 2024/3/24 19:33:29 tags: MD语法文本样式列表结构链接插入图片展示练习实践链接问题 欢迎来到Markdown语法的世界!Markdown是一种简单而直观的标记语言,让文本排版变得轻松有趣。接下…...

Power Apps 学习笔记 -- OrganizationRequestCollection

文章目录 1. OrganizationRequestCollection 简介2. OrganizationRequestCollection2.1 OrganizationRequest 使用2.2 OrganizationRequestCollection 使用 1. OrganizationRequestCollection 简介 OrganizationRequestCollection 链接 : OrganizationRequestCollection Orga…...

python绘图matplotlib——使用记录1

本博文来自于网络收集,如有侵权请联系删除 使用matplotlib绘图 1 常用函数汇总1.1 plot1.2 legend1.3 scatter1.4 xlim1.5 xlabel1.6 grid1.7 axhline1.7 axvspan1.8 annotate1.9 text1.10 title 2 常见图形绘制2.1 bar——柱状图2.2 barh——条形图2.3 hist——直…...

Spring Data访问Elasticsearch----创建存储库实例

Spring Data访问Elasticsearch----创建存储库实例 一、Java配置二、XML配置三、使用过滤器四、独立使用 本文介绍如何为已定义的存储库接口创建实例和bean定义。 一、Java配置 在Java配置类上使用特定于存储的EnableElasticsearchRepositories注解来定义用于存储库激活的配置。…...

Wireshark TS | DNS 案例分析之外的思考

前言 承接之前一篇《Packet Challenge 之 DNS 案例分析》,在数据包跟踪文件 dnsing.pcapng 中,关于第 4 题(What is the largest DNS response time seen in this trace file? )的分析过程中曾经碰到一个小问题,主要…...

nginx集群部署访问不了怎么解决

如果你的Nginx集群部署无法访问,可能有多种原因导致,以下是一些常见的解决方法: 检查网络连接:确保服务器之间的网络连接是正常的,可以通过ping命令或telnet命令检查服务器之间的网络连通性。 检查防火墙设置&#xff…...

抖音小程序开发资质认证流程和资料

开发小程序前,你需要先入驻抖音开发平台开发者平台。包含注册账号、主体认证和对公认证,具体操作可参考注册开发者平台账号。 基础信息提交需要资料 1、营业执照。 本文介绍开发者在抖音开放平台的入驻流程。​ 入驻标准​ 入驻主体主要为中国或海外…...

【JAVA】通过JAVA实现用户界面的登录

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-wyCvaz0EBNwHcwsi {font-family:"trebuchet ms",verdana,arial,sans-serif;f…...

UE5 C++ 3D血条 响应人物受伤 案例

一.3Dwidget 1.创建C Userwidget的 MyHealthWidget,声明当前血量和最大血量 UCLASS() class PRACTICEC_API UMyHealthWidget : public UUserWidget {GENERATED_BODY() public:UPROPERTY(EditAnywhere,BlueprintReadWrite,Category "MyWidget")float C…...

阿里云2核4G服务器支持多少人在线?2C4G多少钱一年?

2核4G服务器支持多少人在线?阿里云服务器网账号下的2核4G服务器支持20人同时在线访问,然而应用不同、类型不同、程序效率不同实际并发数也不同,2核4G服务器的在线访问人数取决于多个变量因素。 阿里云2核4G服务器多少钱一年?2核4…...

【STK】手把手教你利用STK进行导弹和反导仿真02 - STK/MMT模块01 导弹任务分析工具概述

导弹任务分析工具 Missile Mission Toolbox MMT包括4个部分,分别是 导弹设计工具 Missile Design Tool MDT 导弹飞行工具 Missile Flight Tool MFT 拦截飞行工具 Interceptor Flight Tool MCT 导弹转换工具 Missile Conversion Tool MCT 可以用于 创建高保真弹道 评估导弹系统…...

新台阶——蓝桥杯单片机省赛第十四届程序设计题目

在做十四届题目之前,常常听学长说,十四届以前拿省一真的是右手就行,并不相信,在经历十四届痛苦的大量修bug和优化之后,或许学长的话真说对了几分。话不多说,我们开始一起完成单片机第十四届程序设计题目。 …...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

基于服务器使用 apt 安装、配置 Nginx

🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

HTML 列表、表格、表单

1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...