在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

讨论:Java 编程风格的改变

  • 2009-08-17
  • 本文字数:2209 字

    阅读完需:约 7 分钟

最近 Stephan Schmidt 在博客中发表了题为《下一代 Java 编程风格》的文章,阐述了他眼中 Java 编程风格的改变,以及未来的走向:

许多公司和开发人员正在从 Java 转向其他编程语言:Ruby、Python、Grrovy、Erlang 或 Scala 等等。不过你可能做不到这一点。即便如此,你也可以改变你的编程风格,获取这些新语言的优势。事实上,在过去的 15 年中,Java 编程风格也已经有明显变化了。

Stephan 在文章中提出了以下几点:

  1. 尽可能地标注 final:让所有东西不可变,把变量标为 final 可以阻止改变它的值。很多时候,重新为变量赋值会引入 bug,你应该使用新的变量。除此之外,final 可以提高代码的可读性。我针对这个话题还写过一篇文章:《 Java 中所有变量都应该是 final 的
  2. 没有 setter:许多 Java 程序员会自然而然地为类中所有的字段加上 setter。思考一下,真的每个字段都需要修改吗?更好的方法是创建包含改变后状态的新对象。此外,也试着去除 getter,我们应该遵循“ Tell, don’t ask ”的思想。
  3. 避免使用循环来操作 List:从函数式编程那里获得的经验,循环并不是进行集合操作最好方法。例如,我们可以使用 Google Collections 提供的过滤功能。 ```

Predicate canDrinkBeer = new Predicate() {
public boolean apply(HasAge hasAge) {
return hasAge.isOlderThan( 16 );
}
};

List beerDrinkers = filter(persons, canDrinkBeer);

复制代码
4. ** 使用单行代码:**Java 是一门繁杂(noisy)的语言,我们应该编写更精确的代码。尝试将代码写为一行。例如: ```
public int add(int a, int b) { return a + b; }
  1. 使用大量接口:领域驱动设计已经大行其道,一个应该拆分为多种“角色”,即实现多种接口,提高复用程度。方法应该面向“角色”,而不是面向特定的类。我在《不要在 Java 中使用 String 》一文中讨论了更多这方面的内容。
  2. 使用 Erlang 风格的并发:Java 的并发特性(如 lock 和 synchronized)过于低端,难以使用。Erlang 风格的并发是一种更好的做法。Java 平台上已经有了 Akka Actorom 。此外,也可以使用 java.util.concurrent 中的 Join/Fork 和数据结构进行编程。
  3. 使用 Fluent Interface:Fluent Interface 可以使代码更短,更容易编写。Google Collections 中的 MapMaker 是个不错的示例: ```

ConcurrentMap graphs = new MapMaker()
.concurrencyLevel(32)
.softKeys()
.weakValues()
.expiration(30, TimeUnit.MINUTES)
.makeComputingMap(
new Function() {
public Graph apply(Key key) {
return createExpensiveGraph(key);
}
});

复制代码
8. ** 避免在 DTO 中创建 gettersetter:** 如果你拥有简单的 DTO(Data Transfer Object),不要耗费精力去编写 gettersetter,直接使用公开的字段吧。不过在你无法完全控制代码的使用情况时,还是小心为上。

这篇文章发表之后,有许多人发表了不同的看法。其中 Cedric Otaku 发表了文章《下一代 Java 与现在差不多》予以回应,其中反对了 Stephan 提出的大部分观点。

  • 尽可能 final:太多 final 会降低代码的可读性,它无法代码额外的好处。我已经不记得上次因为重新给变量赋值而造成错误是什么时候了。值得一提的是,在字段以外的成员上标记 final 违反了 Google 的风格指南。
  • 避免 setter:看上去不错,不过这不现实。有些时候你不愿把所有的参数都通过构造函数传入。此外,如果使用对象池的时候,可变的对象会让编程更为方便。Stephan 不是第一个提出要将访问器(accessor)从 OO 编程中移除的人,不过这个说法很明显不可行
  • 避免循环:Java 并不适合函数式编程风格,所以我认为使用 Predicate 的代码反而难以读懂。我估计大部分的 Java 程序员会同意我的观点,即使他们已经熟悉了闭包风格。
  • 单行代码:这要视情况而定。并引入临时变量把一个表达式拆开可以提高代码可读性,也容易为其设置断点。
  • 使用接口:不错的建议,但也不能过火。过去我也争论过类似的话题,不过引入太多接口会导致细小类型的爆炸,使你高端的类型意图变得模糊。
  • Erlang 风格并行:重申一点,使用 Java 设计以外的编程风格是危险的做法。java.util.concurrent 中包含了非常有用的功能,我遇到过不少基于这些元素的 Java 抽象,它们要优于 Erlang 风格的 actor 架构。
  • Fluent Interface:这个建议比较有趣,它与 Stephan 提出的另一个建议“避免 setter”相违背。Fluent Interface 只是 setter 的另一种形式,不是吗?
  • 使用公有字段:不,千万别这么做。你不会因为加了访问器而后悔,但是我能保证你会因为一时偷懒,使用了公有字段而后悔莫及。

在 Cedric 的文章之后,Stephan 又对他的说法进行了补充:

没有 setter 并不代表你不能修改这个对象,我只是说纯粹的 setter 不是面向对象的思维方式。例如,你觉得 stop() 和 setStop(true) 哪个更好一些?

(针对 Predicate 代码不易读)我认为你的假设有误。循环是“程序化”的代码,而 Predicate 是经过封装的,可以重用的,易于理解的“对象”。这里并没有函数式编程,这里是纯粹的 OO - 我提起 FP 只是因为我从那里“引入”了这个方式。

还有许多人对 Stephon 和 Cedric 的文章发表了评论,例如有人支持 Stephan 的观点,认为 final 的可以更好的表示出代码的意图。甚至有人提出:

更简单的解决方案是使用 Scala :) - 不可变的状态、统一访问原则(字段、属性、方法看上去一样)、单行代码、使用 monads 或函数来替代循环……这些特性都已经在 Scala 中优雅地体现出来了。

您的 Java 编程风格是什么样的,和过去相比有什么改变吗?

2009-08-17 10:276047
用户头像

发布了 157 篇内容, 共 63.1 次阅读, 收获喜欢 6 次。

关注

评论

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

AI测试开发工程师面试全解析:20道技术核心题+答题思路框架

测试人

软件测试

知识图谱分析系统开发:从数据建模到图计算的工程化落地实践

上海拔俗

烟草专卖执法案卷评查系统:案卷质量效率全域跃升

中烟创新

恶意NuGet包仿冒Tracer.Fody,窃取加密货币钱包数据

qife122

网络安全 供应链攻击

XSKY IceLake 冰湖:开启 PB 级数据归档新时代

XSKY星辰天合

分布式存储,

业务管理软件大模型开发:从“功能系统”到“智能系统”的工程化演进

上海拔俗

超融合基础架构揭秘:一篇文章读懂分布式存储与计算虚拟化

智驱前线

国庆专属互动引流神器 —— 传递红旗小程序系统深度解析

微擎应用市场

第三届信息化教育与计算机技术国际学术会议(IECA 2026)

搞科研的小刘

学术会议 计算机技术

AI 诊断软件系统开发:从工程视角拆解一套可落地的技术架构

上海拔俗

Data Agent 的隐形账单:为什么看起来“最重”的语义建模,反而是企业最省钱的选择?

Aloudata

数据分析 AIAgent ChatBI 智能问数 dataagent

Apache Doris 4.0.2 版本正式发布

SelectDB

数据库 apache 社区 物化视图 #人工智能

超融合:为什么说它重新定义了数据中心?深度解析软件定义与统一管理

智驱前线

第三届电力电子与人工智能国际学术会议(PEAI 2026)

搞科研的小刘

人工智能 学术会议

第五届遥感与测绘国际学术会议(RSSM 2026)

搞科研的小刘

学术会议 遥感测绘

AI 心理辅导系统软件开发:在“情绪支持”与“工程安全”之间建立技术边界

上海拔俗

AI 人工智能预警系统开发:从“规则告警”到“风险前置”的工程化实践

上海拔俗

RFID智能收银系统选型指南:识别精度与通道设计避免结算踩坑

斯科信息

RFID收银系统 斯科

MonkeyCode:2025年企业级AI编程助手的终极解决方案——私有化部署+代码安全扫描+团队协作全搞定

百川云开发者

政策东风下的数字游民:孤独与协作难题,被“搭子文化”治愈了?

网易伏羲

人机协作 网易伏羲 数字游民 群体智能 灵活就业

告别调包侠!2026年Go/Java程序员的AI架构师实战转型指南

王中阳Go

Go AI

第九届智能制造与自动化国际学术会议(IMA 2026)

搞科研的小刘

智能制造 学术会议

2026生物神经网络与智能优化国际研讨会(BNNIO 2026)

搞科研的小刘

学术会议 生物神经网络

第二届人工智能与计算机网络技术国际学术会议(ICAICN 2026)

搞科研的小刘

学术会议 计算机网络技术

基于Amazon Q Developer实现IoT设备的Amazon Timestream性能与成本优化

亚马逊云科技 (Amazon Web Services)

人工智能

AI 标准化考核系统开发:如何用工程手段实现“可量化、可复核、可复用”的智能评估

上海拔俗

以一场展会锚定全年三大核心目标:2026杭州国际人工智能展会

AIOTE智博会

智博会 人工智能博览会 人工智能展 杭州智博会

区块链DApp开发和上线

北京木奇移动技术有限公司

dapp开发 区块链开发 软件外包公司

AI 智能体的开发方法

北京木奇移动技术有限公司

AI智能体 软件外包公司 AI应用开发

行业热议 | 当实时数据平台成为必然布局,IBM 收购 Confluent 释放了什么信号?

tapdata

kafka架构 数据集成 实时数据平台 IBM收购Confluent

AI 智能问答系统开发:从“对话能力”到“可靠知识服务”的工程实践

上海拔俗

讨论:Java编程风格的改变_Java_赵劼_InfoQ精选文章