最近Stephan Schmidt在博客中发表了题为《下一代Java编程风格》的文章,阐述了他眼中Java编程风格的改变,以及未来的走向:许多公司和开发人员正在从Java转向其他编程语言:Ruby、Python、Groovy、Erlang或Scala等等。不过你可能做不到这一 点。即便如此,你也可以改变你的编程风格,获取这些新语言的优势。事实上,在过去的15年中,Java编程风格也已经有明显变化了。
Stephan在文章中提出了以下几点:
尽可能地标注final:让所有东西不可变,把变量标为final可以阻止改变它的值。很多时候,重新为变量赋值会引入bug,你应该使用新的变量。除此之外,final可以提高代码的可读性。我针对这个话题还写过一篇文章:《Java中所有变量都应该是final的》
没有setter:许多Java程序员会自然而然地为类中所有的字段加上setter。思考一下,真的每个字段都需要修改吗?更好的方法是创建包含改变后状态的新对象。此外,也试着去除getter,我们应该遵循“Tell, don’t ask”的思想。
避免使用循环来操作List:从函数式编程那里获得的经验,循环并不是进行集合操作最好方法。例如,我们可以使用Google Collections提供的过滤功能。
Predicate canDrinkBeer = new Predicate() { public boolean apply(HasAge hasAge) { return hasAge.isOlderThan( 16 ); }};List<Person> beerDrinkers = filter(persons, canDrinkBeer);使用单行代码:Java是一门繁杂(noisy)的语言,我们应该编写更精确的代码。尝试将代码写为一行。例如:
public int add(int a, int b) { return a + b; }使用大量接口:领域驱动设计已经大行其道,一个应该拆分为多种“角色”,即实现多种接口,提高复用程度。方法应该面向“角色”,而不是面向特定的类。我在《不要在Java中使用String》一文中讨论了更多这方面的内容。
使用Erlang风格的并发:Java的并发特性(如lock和synchronized)过于低端,难以使用。Erlang风格的并发是一种更好的做法。Java平台上已经有了Akka和Actorom。此外,也可以使用java.util.concurrent中的Join/Fork和数据结构进行编程。
使用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); } });避免在DTO中创建getter和setter:如果你拥有简单的DTO(Data Transfer Object),不要耗费精力去编写getter和setter,直接使用公开的字段吧。不过在你无法完全控制代码的使用情况时,还是小心为上。
这篇文章发表之后,有许多人发表了不同的看法。其中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编程风格是什么样的,和过去相比有什么改变吗?
分享到:
相关推荐
Java编程风格规范是开发者遵循的一套规则和指南,旨在提高代码的可读性、一致性和维护性。Google作为全球知名的技术公司,拥有自己的Java编程风格规范,这些规范不仅适用于其内部开发,也被许多外部开发者采纳作为...
### Java编程风格总结 在Java开发领域中,良好的编程风格对于提高代码的可读性、可维护性和可扩展性至关重要。以下是从一篇关于Java编程风格的文章中提炼的关键知识点。 #### 一、统一编码规范 **原文摘要:** - ...
Java函数式编程是一种编程范式,它强调使用函数作为程序的基本构建块,将计算...通过掌握这些核心概念和实践,你可以提升Java编程能力,特别是在处理大数据、并发和复杂逻辑时,函数式编程能够显著提高代码质量和效率。
### Java编程风格与编码规范详解 #### 一、引言 《Java编程风格》中文版是一本关于Java语言编程风格的指南书籍,旨在为开发者提供一套标准和规范,以提高代码质量和可读性。本书详细介绍了Java编程中应遵循的各种...
1. **Lambda表达式**:Java 8引入的最显著特性之一是Lambda表达式,它使得函数式编程风格在Java中成为可能。Lambda允许开发者用简洁的语法来表示匿名函数,这在处理集合和并发时特别有用。 2. **函数式接口**:为了...
**Java编程规范** Java编程规范是Java程序员遵循的一套规则和约定,旨在提高代码的可读性、可维护性和团队协作效率。以下是一些核心的Java编程规范知识点: 1. **命名规范** - 类名:使用大驼峰命名法...
在Java编程领域,界面设计是不可或缺的一部分,尤其是在开发桌面应用时。本资源“java界面编程-中级界面篇”聚焦于提升Java界面设计的技能,旨在帮助开发者创建更加美观且功能丰富的用户界面。以下将深入探讨Java...
在Java编程领域,这种理念可以帮助开发者提高代码质量、提升开发效率并降低项目风险。 该书的核心知识点包括: 1. **极限编程基础**:介绍XP的基本原则,如频繁交付、持续集成、测试驱动开发(TDD)、结对编程和重构...
以下是一些关键的Java编程规范: 1. **概述** - **编程规范的必要性**:编程规范有助于降低代码阅读难度,提升团队间的沟通效率,使得代码风格统一,减少因个人习惯差异带来的问题。 - **规范文档的要求**:文档...
通过这些新特性的引入,Java 8不仅提高了开发效率和程序的表达能力,还为并行和函数式编程提供了支持,使得Java编程更加现代化和强大。无论是在金融、医疗还是企业级应用开发中,Java 8的新特性都为开发者提供了更多...
此外,为了使界面更具吸引力,我们还可以使用Swing的外观和感觉(LookAndFeel),通过`UIManager`类可以改变界面风格,比如从默认的Metal Look and Feel切换到Windows或Motif风格。 在实际项目中,我们还会遇到布局...
在Java编程领域,窗体界面的设计是至关重要的,它直接影响到用户的交互体验和软件的美观度。本实例“Java多风格窗体制作实例”聚焦于如何利用Java来创建具有不同视觉风格的窗口,以适应不同的操作系统环境或者用户...
### Java完美编程(第三版) ...本章总结了Java编程的基础概念,包括语言起源、基本语法、字符串处理以及编程风格等方面的内容。通过学习本章,读者可以获得Java编程的基本技能,并为进一步深入学习打下坚实的基础。
9. **外观和感觉(LookAndFeel)**:定制或改变应用程序的视觉风格,使其适应不同操作系统或用户偏好。 10. **JTable和JTree**:学习如何创建和使用表格和树形视图展示数据,以及它们的数据模型和列模型。 此外,你...
### Java图形用户界面编程 #### GUI概述 GUI(Graphical User Interface),即图形用户界面,是一种用户通过图形化的视觉元素来交互的操作环境。在Java中,主要有两种方式用于开发GUI应用:`java.awt`和`javax....
开发者可以通过设置LookAndFeel来改变应用的视觉风格。 七、JavaFX JavaFX是Java的一个现代UI框架,提供了更丰富的图形效果和动画功能,适合开发桌面和Web应用。JavaFX支持CSS样式,可以轻松定制界面样式。 总之...
Java GUI(图形用户界面)编程是开发桌面应用程序的重要部分,它可以提供丰富的用户交互体验。炫酷的皮肤包为GUI增加了视觉吸引力,使应用更具个性化。本皮肤包专注于为Java GUI应用提供美观、现代的设计元素,以...
Java GUI(Graphical User Interface)编程是Java编程领域中的一个重要组成部分,主要用于创建具有图形界面的应用程序。GUI使得用户可以通过点击按钮、拖动滑块、填写表单等方式与程序交互,提高了用户体验。在Java...