滨州邹平软件开发邀您一起学习最时髦的未来语言:java学习一种新的编程语言比学习新的口头语言要容易得多。然而,在这两种学习过程中,都要付出额外的努力去学习不带口音地说新语言。如果您熟悉 C 或 C++,那么学习 Java 语言并不困难,这就像是会说瑞典语的人去学丹麦语一样。语言虽有不同,但又彼此互通。但若不够谨慎,您的口音每次都会暴露出您并非原生语言使用者这个秘密。
C++ 程序员往往会对 Java 代码做出一些变形,而这样的举动将他们与原生 Java 语言用户清晰地区分开来。他们的代码可以无错运行,但对于原生语言用户来说,就是有一些地方不对劲。因而原生语言用户可能会轻视非原生用户。从 C 或 C++(或者 Basic、Fortran、Scheme 等)转到 Java 语言时,您需要根除一些习惯用语,并纠正某些发音,以便流畅地使用新语言。
在本文中,我探讨了一些往往被忽视的 Java 编程细节,因为从语义上来说,它们并不重要,甚至是无关紧要的。它们纯粹是风格和惯例问题。其中有些细节有着似是而非的理由,其他一些甚至连似是而非的理由也没有。但所有这些细节都是当今编写的 Java 代码中真实存在的现象。
这是什么语言?
让我们首先来看一段代码,其作用是将华氏温度转换为摄氏度,如清单 1 所示:
清单 1. 一段 C 代码?
float F, C;
float min_tmp, max_tmp, x;
min_tmp = 0;
max_tmp = 300;
x = 20;
F = min_tmp;
while (F <= max_tmp) {
C = 5 * (F-32) / 9;
printf("%f\t%f\n", F, C);
F = F + x;
}
清单 1 中使用的是什么语言?很显然是 C 语言 —请等一下,让我们来看看完整的程序,如清单 2 所示:
清单 2. Java 程序
class Test {
public static void main(String argv[]) {
float F, C;
float min_tmp, max_tmp, x;
min_tmp = 0;
max_tmp = 300;
x = 20;
F = min_tmp;
while (F <= max_tmp) {
C = 5 * (F-32) / 9;
printf("%f\t%f\n", F, C);
F = F + x;
}
}
private static void printf(String format, Object... args) {
System.out.printf(format, args);
}
}
无论您是否相信,清单 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。
args而非 argv
这一点是最微不足道的,但也正是这场风格之争所关注的细节。在 Java 的惯例中 main()方法的参数名为 args,而不是 argv:
public static void main(String[] args)
这至多只是对 argv 这个名称进行了一点细微的改进。作为参数的缩写,它或多或少地比 argv 更易懂一些。 当然,在合乎惯例的 Java 代码中,通常是禁止使用缩写的(参见 请勿缩写)。我们使用 args 作为 main() 方法的参数名的惟一原因与 C 程序员使用 argv 的原因是相同的 — 第一本关于 C 语言的图书的作者 Kernighan 和 Ritchie 使用了这个名称。而 Gosling 和 Arnold 使用了 args。除此之外,再无其他原因。同样,所有原生 Java 程序员都倾向于使用 args,如果您希望保持原汁原味,那么也应该这样做。滨州邹平软件开发邀您一起学习最时髦的未来语言:java
Java 编程中的基本命名规则非常简单,也值得牢记:
类和接口名以大写字母开头,如 Frame。
方法、字段和本地变量名以小写字母开头,如 read()。
类、方法和字段名均使用驼峰式大小写风格,如 InputStream 和 readFully()。
常量 — 终态静态字段和临时终态本地变量 — 全部适用大写字母,并以下划线分隔各词,如 MAX_CONNECTIONS。
请勿缩写