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:491261
用户头像

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

关注

评论

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

耗时半年,堪称奇迹!阿里架构师整合出258W字Java全栈面试题

钟奕礼

Java 编程 程序员 架构 java面试

神器 SpringDoc 横空出世!最适合 SpringBoot 的API文档工具来了

Java快了!

SP【ring

历经70+场面试,我发现了大厂面试的bug,并总结其中心得

钟奕礼

Java 编程 架构 java面试

开源公开课丨ChengYing安装原理剖析

袋鼠云数栈

袋鼠云产品功能更新报告01期丨用诚心倾听您的需求

袋鼠云数栈

B2B企业节,永洪科技

科技云未来

运维去大公司好还是小公司好?你怎么看?

行云管家

运维 IT IT运维

数字藏品:为什么这么火爆,那么多人购买?

开源直播系统源码

区块链+ NFT 数字藏品 数字藏品开发 数字藏品系统

GitHub永远的神!“阿里爸爸”终于总结出15W字Java源码真题手册

钟奕礼

Java 编程 架构 java面试 技术宅

真的香!这份《Java面试题库大全》在Github一夜爆火后直接被各大厂要求封杀!

钟奕礼

Java 编程 架构 java面试 技术宅

面试以前上司,能力一般,不想给他通过,但他卑微哀求,怎么办?

钟奕礼

Java 编程 架构 面试 后端

ChunJun Meetup演讲分享 | 基于袋鼠云开源框架的数仓一体化建设探索

袋鼠云数栈

工赋开发者社区 | Transformers如何用于遥感?阿联酋MBZUAI最新《Transformers遥感处理》综述,涵盖60+种ViT遥感方法

工赋开发者社区

干货 | Docker 还可以搭建Web服务器nginx ?这么宝藏的吗?

霍格沃兹测试开发学社

画一个 “月饼” 陪我过中秋,玩转炫彩 “月饼” 之 基本测试

矜辰所致

中秋 月饼 ESP32-C3 9月月更

字节码增强技术之 Java Agent 入门

Java快了!

java;

大数据和人工智能离不开云计算,他们之间有什么关系?

Finovy Cloud

人工智能 云计算 大数据

Java 序列化10倍性能优化对比测试

FunTester

干货 | APP自动化Android之属性获取与断言

霍格沃兹测试开发学社

干货 | Chrome 浏览器+Postman还能这样做接口测试 ?

霍格沃兹测试开发学社

真的强!来自扫地僧总结的39W字上千道Java一线大厂面试题手册,成功助我拿下蚂蚁金服offer!

钟奕礼

Java 编程 架构 后端 java面试

严禁外传,字节跳动2022秋招Java岗位架构师面试题(暂定版)发布

钟奕礼

Java 编程 程序员 架构 java面试

泪洒阿里,面试惜败闭关2月金九银十再战Alibaba!

钟奕礼

Java 编程 架构 后端 java面试

LED显示屏有哪些让你无法拒绝的优点

Dylan

LED显示屏 户外LED显示屏

字节前端二面高频面试题

loveX001

JavaScript 前端

实战 | 电商业务性能测试(二): Jmeter 参数化功能实现注册登录的数据驱动

霍格沃兹测试开发学社

leetcode 543. Diameter of Binary Tree 二叉树的直径(简单)

okokabcd

Java LeetCode 数据结构与算法

不下载软件,可以把电脑本地文件快速传到远端服务器里吗?

行云管家

服务器 云端 远程 本地

字节架构师离职后,熬夜整理55W字Java面试手册,逆风翻盘进阿里

钟奕礼

Java 编程 架构 后端 java面试

5000页?一份字节跳动Java面试全解手册发布!瞬间登顶各大搜索栏

钟奕礼

Java 编程 架构 后端 java面试

直播回顾|容器如何提升应用的稳定性?(附PPT下载)

BoCloud博云

云计算 容器 云原生

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