设为首页 加入收藏

TOP

使用原汁原味的Java语言
2014-10-30 21:00:15 】 浏览:321
Tags:使用 原汁原味 Java 语言

  学习一种新的编程语言比学习新的口头语言要容易得多。然而,在这两种学习过程中,都要付出额外的努力去学习不带口音地说新语言。如果您熟悉 C 或 C++,那么学习 Java 语言并不困难,这就像是会说瑞典语的人去学丹麦语一样。语言虽有不同,但又彼此互通。但若不够谨慎,您的口音每次都会暴露出您并非原生语言使用者这个秘密。


  C++ 程序员往往会对 Java 代码做出一些变形,而这样的举动将他们与原生 Java 语言用户清晰地区分开来。他们的代码可以无错运行,但对于原生语言用户来说,就是有一些地方不对劲。因而原生语言用户可能会轻视非原生用户。从 C 或 C++(或者 Basic、Fortran、Scheme 等)转到 Java 语言时,您需要根除一些习惯用语,并纠正某些发音,以便流畅地使用新语言。


  在本文中,我探讨了一些往往被忽视的 Java 编程细节,因为从语义上来说,它们并不重要,甚至是无关紧要的。它们纯粹是风格和惯例问题。其中有些细节有着似是而非的理由,其他一些甚至连似是而非的理由也没有。但所有这些细节都是当今编写的 Java 代码中真实存在的现象。


  这是什么语言


  让我们首先来看一段代码,其作用是将华氏温度转换为摄氏度,如清单 1 所示:


  清单 1. 一段 C 代码



  清单 1 中使用的是什么语言 很显然是 C 语言 ―请等一下,让我们来看看完整的程序,如清单 2 所示:


  清单 2. Java 程序



  无论您是否相信,清单 1 和清单 2 都是使用 Java 语言编写的。它们只是以 C 语言方言(老实说,清单 1 也确实可以是 C 代码)编写的 Java 代码。这里的几个习语标志着:编写这段代码的人是以 C 语言思考的,只是单纯地将其翻译为 Java 语言:


  变量是 float 而非 double。


  所有变量都是在方法上方声明的。


  初始化紧接声明之后。


  使用了 while 循环而非 for 循环。


  使用了 printf 而非 println。


  main() 方法的参数名为 argv。


  数组括号紧接参数名之后,而非类型之后。


  如果仅仅考虑所编写的这些代码是否能够编译或者是否会得到正确的结果,那么这些方言都不是错误的。如果分开来看,这几点都并不明显。但将它们结合在一起,就构成了一段非常古怪的代码,Java 程序员难以读懂,就像美国人难以听懂北英格兰人的方言一样。您使用的此类 C 语言方言越少,您的代码就会越清晰。请牢记这一点,下面我们将继续分析 C 语言程序员暴露自己身份的一些常见方式,并说明如何才能使他们的代码更符合 Java 程序员的眼光。


  命名规范


  根据您原本使用的是 C、C++ 还是 C#,您可能有一些较为主观的类命名规范。举例来说,在 C# 中,类名都是以小写字母开头的,方法名和字段名以大写字母开头。Java 风格则恰好相反。我没有任何合理的原因能评判一种规范是否比另一种更好,但我了解,混用命名规范会使代码看起来存在严重错误。这种做法也会导致 bug。如果您知道,每一个全部由大写字母组成的名称都是常量,则会以不同的方式进行处理。在寻找命名规范与声明类型不匹配之处时,我发现了程序中的许多 bug。


  Java 编程中的基本命名规则非常简单,也值得牢记:


  类和接口名以大写字母开头,如 Frame。


  方法、字段和本地变量名以小写字母开头,如 read()。


  类、方法和字段名均使用驼峰式大小写风格,如 InputStream 和 readFully()。


  常量 ― 终态静态字段和临时终态本地变量 ― 全部适用大写字母,并以下划线分隔各词,如 MAX_CONNECTIONS。


  请勿缩写


  像 sprintf 和 nmtkns 这样的名称是超级计算机只有 32 KB 内存时代的遗物。编译器将标识符限制为 8 个字符或更少,以此来节约内存。近 30 年来,这已经不再是需要担心的问题。如今,再没有任何理由不使用完整拼写的变量和方法名称。难以解读、无元音字母的变量名清楚地表明这个程序出自一名皈依 Java 的 C 程序员之手,请参见清单 3:


  清单 3. Abbrvtd nms r hrd 2 rd



  不缩写、采用驼峰式大小写风格的名称更易读易懂,如清单 4 所示:


  清单 4. 未缩写的名称更易读



  一段代码被阅读的次数要远远超过编写的次数,Java 语言为易读性而进行了优化。C 程序员近乎沉迷于难解的代码,而 Java 程序员则不然。Java 语言将易读性置于简洁性之前。


  有一些极为常用的缩写形式,您仍然可以放心使用:


  max 表示最大(maximum)


  min 表示最小(minimum)


  in 表示 InputStream


  out 表示 OutputStream


  e 或 ex 表示 catch 子句中的异常(不用于其他位置)


  num 表示数字(number),仅用作前缀,如 numTokens 或 numHits


  tmp 表示主要在本地使用的临时变量 ― 针对实例,在交换两个值的时候


  除此之外(或许还有少数一些例外),您应完整拼写出名称中使用的所有词。


  变量声明、初始化和使用(重用)


  早期版本的 C 需要在方法开始处声明所有变量。这样是为了在编译器中实现一定的优化,允许它在 RAM 极为有限的环境中运行。因而,C 语言中的方法大多以几行变量声明开头:





  然而,这种风格也有一些缺陷。它将变量的声明与其使用分离开来,使代码的易读性降低。此外,它会为多种不同的用途重用一个本地变量,有可能并非刻意而为。但若变量持有代码的某个片段无法接受的残值,这可能会带来无法预料的 bug。这一点与 C 语言中简短而难解的变量名结合在一起,将会后患无穷。


  在 Java 语言(和较新版本的 C 语言)中,变量可在初次使用或接近初次使用时声明。在编写 Java 代码时,请采取这种做法。这将使您的代码更加安全、更不易出现 bug,也更易于阅读。


  此外,Java 代码通常在声明变量时初始化各变量,而 C 程序员有时会写出下面这样的代码:





  尽管这在语法上是正确的,但 Java 程序员永远不会写出这样的代码。他们会这样写这段代码:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Hibernate一对多单向关系 下一篇深入Java虚拟机中的Stack和Heap

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目