我相信我是在1997年开始使用Java的,就在Java 1.1问世后不久。从那时起,总的来说,我真的很喜欢用Java编程;虽然我承认现在,我编写Groovy脚本的可能性和用Java编写“严肃代码”的可能性一样。
我拥有FORTRAN、PL/1、Pascal,以及最后的C的背景,我发现Java有很多值得喜欢的地方。Java是我第一次大量实践面向对象编程。 到那时,我已经编程了大约20年,可以肯定地说,我对什么重要,什么不重要有一些想法。
将调试作为关键语言特性
我真的很讨厌浪费时间来追踪那些因我的代码不小心迭代到数组末尾而导致的晦涩难懂的错误,尤其是在IBM大型机上用FORTRAN编程的时代。 另一个不时出现的微妙问题是用一个四字节整数参数调用一个需要两字节的子程序; 在小端架构上,这通常是一个良性错误,但在大端机器上,高两位字节的值通常(但并非总是)为零。
在那个批处理环境中调试也很尴尬——仔细研究核心转储或插入打印语句,这些语句本身可能会移动错误,甚至使它们消失。
所以我在Pascal方面的早期经验,首先是在MTS上,然后使用相同的MTS编译器在IBM OS/VS1上,让我的生活变得轻松了很多。 Pascal的强类型和静态类型是这里获胜的很大一部分,而且我使用过的每个Pascal编译器都会在运行时检查数组边界和范围,因此会在发生点检测到错误。 当我们在20世纪80年代初将大部分工作转移到Unix系统时,移植Pascal代码是一项简单的任务。
找到合适的语法量
但尽管我喜欢Pascal的很多东西,我的代码很冗长,而且语法似乎倾向于稍微掩盖代码; 例如,使用
if … then begin … end else … end
代替
if (…) { … } else { … }
在C和类似语言中。 此外,有些事情在Pascal中很难做到,但在C中却容易得多。 但是,随着我越来越多地使用C,我发现自己遇到了过去在FORTRAN中常犯的同样类型的错误——例如,运行到数组末尾——这些错误并没有在原始错误点检测到,而只是在程序执行过程中通过其不利影响检测到。 幸运的是,我不再生活在批处理环境中,并且手头有很棒的调试工具。 尽管如此,C还是给了我太多的灵活性,对我自己来说未必是好事。
当我发现awk时,我发现我有一个很好的C的对应物。 那时,我的很多工作都涉及到转换字段数据和创建报告。 我发现我可以用awk做很多令人惊讶的事情,再加上其他Unix命令行工具,如sort、sed、cut、join、paste、comm等等。 本质上,这些工具给了我一些很像文本文件的关系数据库管理器,它具有面向列的结构,这是我们的许多字段数据传入的方式。 或者,如果不是完全以这种格式,大多数情况下,数据可以从关系数据库或某种二进制格式卸载到该面向列的结构中。
awk支持的字符串处理、正则表达式和关联数组,以及awk的基本性质(它实际上是一个数据转换管道),非常符合我的需求。 当遇到二进制数据文件、复杂的数据结构和绝对性能需求时,我仍然会恢复到C; 但是随着我越来越多地使用awk,我发现C非常基本的字符串支持越来越令人沮丧。 随着时间的推移,我最终只会不得已时才使用C——并且可能会在其余时间过度使用awk。
Java是正确的抽象级别
然后Java出现了。 它看起来很好——一种相对简洁的语法,让人想起C,或者至少比Pascal或任何其他早期经验更像。 它是强类型的,因此许多编程错误会在编译时被捕获。 开始使用它似乎不需要太多的面向对象的学习,这是一件好事,因为我当时对OOP设计模式几乎不熟悉。 但即使在早期,我也喜欢其简化的继承模型背后的想法。(Java允许使用接口进行单一继承,以在某种程度上丰富该范例。)
它似乎附带了丰富的功能库(“内置电池”的概念),该功能库在正确的级别上工作,可以直接满足我的需求。 最后,我发现我很快就喜欢上了数据和行为被分组到对象中的想法。 这似乎是显式控制数据之间交互的好方法——比巨大的参数列表或对全局变量的不受控制的访问要好得多。
从那时起,Java已发展成为我编程工具箱中的瑞士军刀。 当它们显然并且精确地是解决手头问题的直接方式时,我仍然会偶尔用awk编写一些东西,或者使用Linux命令行实用程序,如cut、sort或sed。 但是,我怀疑我在过去20年中是否编写过50行C代码; Java已经完全取代了C的需求。
此外,Java一直在随着时间的推移而改进。 首先,它的性能变得更高。 它添加了一些非常有用的功能,例如try with resources,它可以很好地清理在文件I/O期间处理错误处理的冗长且有些混乱的代码; 或者lambdas,它提供了声明函数并将它们作为参数传递的能力,而不是旧方法,后者需要创建类或接口来“托管”这些函数; 或者streams,它将迭代行为封装在函数中,从而创建一个以链接函数调用形式实现的有效数据转换管道。
Java越来越好
许多语言设计者一直在寻找从根本上改善Java体验的方法。 对我来说,这些中的大多数目前还不是很有趣; 同样,这更多地反映了我的典型工作流程,(远) less那些语言带来的功能的函数。 但是,这些进化步骤之一已成为我编程武器库中不可或缺的一部分:Groovy。 当我遇到一个需要小型解决方案的小问题时,Groovy已成为我的首选解决方案。 此外,它与Java高度兼容。 对我来说,Groovy填补了Python对许多其他人来说所填补的相同位置——它紧凑、DRY(不要重复自己)并且富有表现力(列表和字典具有完整的语言支持)。 我也使用Grails,它使用Groovy为非常高性能且有用的Java Web应用程序提供简化的Web框架。
但是Java仍然是开源的吗?
最近,对OpenJDK日益增长的支持进一步提高了我对Java的舒适度。 许多公司以各种方式支持OpenJDK,包括AdoptOpenJDK、Amazon和Red Hat。 在我更大的和更长期的项目中,我们使用AdoptOpenJDK在多个桌面平台上生成自定义运行时。
是否存在比Java更好的语言? 我敢肯定存在,这取决于你的工作需求。 但我仍然是一个非常快乐的Java用户,而且我还没有看到任何会威胁到让我离开的东西。
8 条评论