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命令检查服务器之间的网络连通性。 检查防火墙设置ÿ…...
抖音小程序开发资质认证流程和资料
开发小程序前,你需要先入驻抖音开发平台开发者平台。包含注册账号、主体认证和对公认证,具体操作可参考注册开发者平台账号。 基础信息提交需要资料 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和优化之后,或许学长的话真说对了几分。话不多说,我们开始一起完成单片机第十四届程序设计题目。 …...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
