使用原汁原味的Java语言(下)

发表于:2010-3-30 11:00

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

#
java

  不要回收变量

  上述讨论得出这样一个结论,Java 程序员几乎不会为不同的值和对象重用本地变量。例如,清单 10 建立了一些按钮及其关联的动作侦听器:

  清单 10. 回收本地变量

Button b = new Button("Play");
b.addActionListener(new PlayAction());
b = new Button("Pause");
b.addActionListener(new PauseAction());
b = new Button("Rewind");
b.addActionListener(new RewindAction());
b = new Button("FastForward");
b.addActionListener(new FastForwardAction());
b = new Button("Stop");
b.addActionListener(new StopAction());

  经验丰富的 Java 程序员会用 5 个不同的本地变量重写这段代码,如清单 11 所示:

  清单 11. 未回收的变量

Button play = new Button("Play");
play.addActionListener(new PlayAction());
Button pause = new Button("Pause");
pause.addActionListener(new PauseAction());
Button rewind = new Button("Rewind");
rewind.addActionListener(new RewindAction());
Button fastForward = new Button("FastForward");
fastForward.addActionListener(new FastForwardAction());
Button stop = new Button("Stop");
stop.addActionListener(new StopAction());

  为多个逻辑上不同的值或对象重用一个本地变量容易导致 bug。实际上,本地变量(并非始终是它们指向的对象)并不影响内存和时间问题。所以不必为此担忧,可以根据您的需要使用多个不同的本地变量。

  使用首选原语数据类型

  Java 语言有八种原语数据类型,但仅使用了其中的六种。在 Java 代码中,float 比 C 代码中少得多。float 变量或文字在 Java 代码中极为罕见,更常用的是 double。使用 float 的惟一时机就是操纵精度有限的大型多维浮点数字数组,此时存储空间较为重要。否则使用 double 即可。

  比 float 更不常见的是 short。我在 Java 代码中几乎没有见过 short 变量。只有惟一的一次(我要警告您,这是极其罕见的情况),读入的外部定义数据格式碰巧包含 16 位有符号整型类型。在这种情况下,大多数程序员都会将其作为 int 读入。

  确定私有属性的范围

  您是否见过清单 22 中这种 equals() 方法?

  清单 12. C++ 程序员编写的 equals()方法

public class Foo {
private double x;
  public double getX() {
  return this.x;
  }
  public boolean equals(Object o) {
    if (o instanceof Foo) {
    Foo f = (Foo) o;
    return this.x == f.getX();
    }
  return false;
  }
}

  这个方法在技术上是正确的,但我确信,这个类是由一名保守的 C++ 程序员编写的。他在一个方法中使用了私有字段 x 和公共 getter 方法 getX(),实际上是在一行代码之中,这泄漏了他的身份。在 C++ 中,这种做法是必要的,因为私有属性的范围是对象而不是类。也就是说,在 C++ 中,同一个类的对象无法看到彼此的私有成员变量。他们必须使用 accessor 方法。在 Java 语言中,私有属性的范围是类而非对象。类型同为 Foo 的两个对象可直接访问对方的私有字段。

  某些微妙 — 往往又不相关 — 的考虑思路认为,您应该在 Java 代码中首选直接字段访问而非 getter 访问,或者反之。字段访问相对速度较快,但在少数时候,getter 访问可能会提供与直接字段访问略有不同的值,特别是在涉及子类的时候。在 Java 语言中,没有任何理由在同一行代码中为同一个类的同一个字段同时使用直接字段访问和 getter 访问。

  标点和语法方言

  下面是一些与 C 语言对应部分不同的 Java 方言,在某些情况下,这样的差异是为了利用某些 Java 语言特性。

  将数组括号紧接于类型之后

  Java 语言声明数组的方式与 C 语言中大致相同:

  int k[];
  double temperature[];
  String names[];

  但 Java 语言也提供了一种替代性的语法,将数组复括号紧接于类型之后,而不是变量名之后:

  int[] k;
  double[] temperatures;
  String[] names;

  大多数 Java 程序员都采用了第二种风格。上面的代码表示 k 的类型是 int 数组,temperatures 的类型是 double 数组,names 的类型是 String 数组。

  同样,与其他本地变量一样,Java 程序员习惯在声明时初始化这些变量:

  int[] k = new int[10]; double[] temperatures = new double[75]; String[] names = new String[32];

  使用 s == null 而不是 null == s

  谨慎的 C 程序员已经学会了将文字置于比较运算符的左侧。例如:

  if (7 == x) doSomething();

  目标在于避免意外地使用单等号赋值运算符而非双等号比较运算符:

  if (7 = x) doSomething();

  若将文字置于左侧,这样的错误就会成为编译时错误。这项技巧是 C 语言中一项著名的编程实践。它能帮助避免出现真正的 bug,因为若将文字置于右端,将始终返回 true。

  然而,不同于 C 语言,Java 语言具有独立的 int 和 boolean 类型,赋值运算符返回 int,而比较运算符返回 boolean。因而,if (x = 7) 已经成为编译时错误,就没有必要为比较语句使用不自然的形式 if (7 == x),流畅的 Java 程序员不会这样做。

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号