2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

试着发挥静态类型语言的最大功效

  • 2008-04-17
  • 本文字数:943 字

    阅读完需:约 3 分钟

Debasish Ghosh 对一场动态 VS. 静态语言的讨论做出了回应,提出了用静态语言编程时动态类型检查的使用问题。他回忆了 Greenspun 第十编程法则:“任何使用静态类型检查语言编写的、足够复杂的程序都包含一个特定、非正式定义、容易引入 Bug 且缓慢的动态检查语言实现。”

Ghosh 认为如今不一定要这样。他主张,Java 泛型(比如 Guice 和 EasyMock)能避免那些为了强制执行运行时类型检查而采取的权宜之计:

原先在有些情况下不得不模拟运行时类型检查,既缓慢又容易引入 Bug,而利用 Java 泛型,这些框架就可以通过编译时类型检查来达到同样的效果。Guice 和 EasyMock 是我用过的比较优秀的两个框架,它们利用泛型实现了突出的类型安全。[……]

看一下下面这段代码,它用 Guice Binder 把实现SpecialServiceImpl``绑定到接口``<span id="tnuu">Service</span> 上。

public class MyModule implements Module {
public void configure(Binder binder) {
binder.bind(Service.class)
.to(SpecialServiceImpl.class)
.in(Scopes.SINGLETON);
}
}

尽管“Service和 <span id="q4qw">SpecialServiceImpl</span>``之间的“<span id="fddp"><strong id="yod5"> 实现 </strong></span>``”关系看起来是在运行时完成的”,但所有的类型检查实际上是在编译时进行的:

快速看一下 Guice 的源码,可以看到 BinderImpl.bind() 方法返回 BindingBuilderImpl……

public BindingBuilderImpl bind(Class clazz) {
return bind(Key.get(clazz));
}

BindingBuilderImpl.to() 方法则把 Class 作为输入——加在类型通配符上的限制使对参数的编译时类型检查实际上起到检查“实现”关系的作用……

public ScopedBindingBuilder to(Class extends T> implementation) {
return to(TypeLiteral.get(implementation));
}

Debasish Ghosh 提倡使用这种解决方法,而不是试图实现动态类型检查。这种方法不仅能避免 Greenspun 第十编程法则,还能充分利用静态类型,因为它能保证强大的类型安全:

在你用静态类型语言编程的时候,利用适当的语言特性让大部分的类型检查在编译时进行。这样,在你点击运行按钮之前,你就能确信你的代码符合类型系统的规则。你还能够对你的代码集进行更为简单的重构和更加清晰的改进。

查看英文原文: Try to get the best of your Statically Typed Language

2008-04-17 19:491256
用户头像

发布了 151 篇内容, 共 68.8 次阅读, 收获喜欢 18 次。

关注

评论

发布
暂无评论
发现更多内容

唯品会:在 Flink 容器化与平台化上的建设实践

Apache Flink

flink

1小时学会不打代码制作一个网页精美简历(1)

1_bit

大前端 低代码 iVX 低代码开发平台

腾讯安全姬生利:《数据安全法》下,云上数据安全最佳实践

腾讯安全云鼎实验室

数据安全 云安全 数据安全法

Rust从0到1-泛型-生命周期

rust 泛型 生命周期 generic lifetimes

新版发布|ShardingSphere 5.0.0-beta 来了!

SphereEx

ShardingSphere

高寿命NVMe SSD应用场景探讨

怀瑾握瑜

区块链 数据库 云计算 SSD 虚拟货币

为什么大家都在用WebRTC?

anyRTC开发者

音视频 WebRTC 语音通话 视频通讯

架构实战营 模块六:课后作业

👈

架构实战营

体验为先,博睿数据打造以用户会话为中心的监测体系

博睿数据

博睿数据 数据链DNA DEM

网络为本,博睿数据NPMD用20%的投入实现80%的功能

博睿数据

博睿数据 数据链DNA NPMD

工作年限、成长路线、进阶技术。怎样才能成为架构师?

Linux服务器开发

Linux服务器开发 Linux后台开发 软件架构师 服务器架构师 C++架构师

多云部署又添新「云」,EMQ X Cloud 正式支持腾讯云部署

EMQ映云科技

阿里云 IoT 华为云 云平台 #腾讯云

一份283页pdf,五大核心内容,熬夜“啃完”,竟拿下了阿里offer

Java 程序员 架构 面试

墨奇,以“一手之力” 证明你就是你

E科讯

字节跳动亿级视频处理系统高可用架构实践

火山引擎开发者社区

架构 后端 音视频

网络态势感知是什么?

郑州埃文科技

低代码助力企业生产管理8大招式,你学废(hui)了吗?

优秀

低代码

【签约计划】百位签约创作者名单公布

InfoQ写作社区官方

签约计划

【Linux】使用 systemd 管理 frp 服务

赖猫

Linux 后端

管理者如何避免主观偏见

石云升

职场经验 管理经验 6月日更

ROS CDK | 云上资源自动化部署新模式

郭旭东

阿里云 ROS 基础设施即代码 IaC

微警务系统搭建,智慧派出所平台建设解决方案

开发5年!三面字节,成功拿到27k*17offer,原来也没那么难

Java 程序员 架构 面试

自从有了这个工具,一键代码迁移不在话下

华为云开发者联盟

代码迁移 鲲鹏DevKit 汇编翻译 汇编语言 Kunpeng

2021年,想要成为年薪百万的Java架构师需要掌握哪些技术?

Java架构师迁哥

Flink 和 Iceberg 如何解决数据入湖面临的挑战

Apache Flink

flink

机器数及特点

若尘

计算机组成原理 6月日更

【小技巧】Google浏览器设置之Tab折叠分组

恒生LIGHT云社区

推荐 浏览器书签 谷歌 工具分享

双指针法

后台服务器开发

c++ 双指针 LeetCode

剪视频一点都不难,多款超实用剪辑软件全方位评测!

懒得勤快

短视频 视频剪辑 视频制作

前端 JavaScript 复制粘贴的奥义——Clipboard 对象概述

编程三昧

JavaScript 大前端

试着发挥静态类型语言的最大功效_架构_Sadek Drobi_InfoQ精选文章