审查Java代码的十一种常见错误(3)

文章作者 100test 发表时间 2007:03:14 17:00:59
来源 100Test.Com百考试题网


七、常见错误7#:用== 替代.equals

  在Java中,有两种方式检查两个数据是否相等:通过使用==操作符,或者使用所有对象都实现的.equals方法。原子类型(int, flosat, char 等)不是对象,因此他们只能使用==操作符,如下所示:

int x = 4.
int y = 5.
if (x == y)
System.out.println ("Hi").
// This ’if’ test won’t compile.
if (x.equals (y))
System.out.println ("Hi").

  对象更复杂些,==操作符检查两个引用是否指向同一个对象,而equals方法则实现更专门的相等性检查。

  更显得混乱的是由java.lang.Object 所提供的缺省的equals方法的实现使用==来简单的判断被比较的两个对象是否为同一个。

  许多类覆盖了缺省的equals方法以便更有用些,比如String类,它的equals方法检查两个String对象是否包含同样的字符串,而Integer的equals方法检查所包含的int值是否相等。

  大部分时候,在检查两个对象是否相等的时候你应该使用equals方法,而对于原子类型的数据,你用该使用==操作符。

  八、常见错误8#: 混淆原子操作和非原子操作

  Java保证读和写32位数或者更小的值是原子操作,也就是说可以在一步完成,因而不可能被打断,因此这样的读和写不需要同步。以下的代码是线程安全(thread safe)的:

public class Example{
  private int value. // More code here...
  public void set (int x){
   // NOTE: No synchronized keyword
   this.value = x.
  }
}

  不过,这个保证仅限于读和写,下面的代码不是线程安全的:

public void increment (){
  // This is effectively two or three instructions:
  // 1) Read current setting of ’value’.
  // 2) Increment that setting.
  // 3) Write the new setting back.
  this.value.
}

  在测试的时候,你可能不会捕获到这个错误。首先,测试与线程有关的错误是很难的,而且很耗时间。其次,在有些机器上,这些代码可能会被翻译成一条指令,因此工作正常,只有当在其它的虚拟机上测试的时候这个错误才可能显现。因此最好在开始的时候就正确地同步代码:

public synchronized void increment (){
  this.value.
}


相关文章


Borland被选举为Java社群过程计划的执行委员会成员
在Javascript中为String对象添加trim,ltrim,rtrim方法
Java论证考试资格基础知识:ASP 和JSP大比拚
实现JAVA的动态类载入机制
审查Java代码的十一种常见错误(3)
审查Java代码的十一种常见错误(2)
审查Java代码的十一种常见错误(1)
JAVA基础:MVC减少编程复杂性
JAVA基础:自动生成你的程序开发文档
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛