易截截图软件、单文件、免安装、纯绿色、仅160KB

【转】如何在Java中避免equals方法的隐藏陷阱

译者注 :你可能会觉得Java很简单,Object的equals实现也会非常简单,但是事实并不是你想象的这样,耐心的读完本文,你会发现你对Java了解的是如此的少。如果这篇文章是一份Java程序员的入职笔试,那么不知道有多少人会掉落到这样的陷阱中。原文转自http://www.artima.com/lejava/articles/equality.html 三位作者都是不同领域的大拿,有兴趣的读者可以从上面这个连接直接去阅读原文。
摘要
本文描述重载equals方法的技术,这种技术即使是具现类的子类增加了字段也能保证equal语义的正确性。
在《Effective Java》的第8项中,Josh Bloch描述了当继承类作为面向对象语言中的等价关系的基础问题,要保证派生类的equal正确性语义所会面对的困难。Bloch这样写到:
除非你忘记了面向对象抽象的好处,否则在当你继承一个新类或在类中增加了一个值组件时你无法同时保证equal的语义依然正确
在《Programming in Scala》中的第28章演示了一种方法,这种方法允许即使继承了新类,增加了新的值组件,equal的语义仍然能得到保证。虽然在这本书中这项技术是在使用Scala类环境中,但是这项技术同样可以应用于Java定义的类中。在本文中的描述来自于Programming in Scala中的文字描述,但是代码被我从scala翻译成了Java
常见的等价方法陷阱
java.lang.Object 类定义了equals这个方法,它的子类可以通过重载来覆盖它。不幸的是,在面向对象中写出正确的equals方法是非常困难的。事实上,在研究了大量的Java代码后,2007 paper的作者得出了如下的一个结论:
几乎所有的equals方法的实现都是错误的!
这个问题是因为等价是和很多其他的事物相关联。例如其中之一,一个的类型C的错误等价方法可能意味着你无法将这个类型C的对象可信赖的放入到容器中。比如说,你有两个元素elem1和elem2他们都是类型C的对象,并且他们是相等,即elem1.equals(elm2)返回ture。但是,只要这个equals方法是错误的实现,那么你就有可能会看见如下的一些行为:
Set hashSet = new java.util.HashSet();
hashSet.add(elem1);
hashSet.contains(elem2); // returns false!
当equals重载时,这里有4个会引发equals行为不一致的常见陷阱:
定义了错误的equals方法签名(signature) Defining equals with the wrong signature.
重载了equals的但没有同时重载hashCode的方法。 Changing equals without also changing hashCode.
建立在会变化字域上的equals定义。 Defining equals


相关文档:

Java读取文件的简单代码

网址:  http://blog.csdn.net/justinavril/archive/2008/08/06/2775767.aspx
import
 java.io.*;  
  
public
 
class
 FileToString {  
     public
 
static
 String readFile(String fileName)  ......

Java求职简历

个 人 简 历
姓    名:
王志国
性    别:

年    龄:
23岁
联系电话:
13124799190
专    业:
计算机技术
工作时间:
一年以上
学    历:
大专
邮    箱:
andy478168@yeah.net
★ 求职意向
工作性质 ......

wiki系统(JAVA) 观察


最近想对于wiki系统的源代码研究下
 
jspwiki是一个不错的wiki引擎,纯jsp/servlet写的。JSPWiki不使用现成的数据库管理软件,所有的文件以文本文件的形式存放。它利用类似CVS的机制保证了文件版本的完整性。支持中文,支持版本比较、权限管理等功能!
项目主页: http://www.jspwiki.org/
文档地址:  ......

[转载]Java开发最容易犯的几种错误

1.Duplicated Code
 
代码重复几乎是最常见的异味了。他也是Refactoring的主要目标之一。代码重复往往来自于copy-and-paste的编程风格。与他相对应OAOO是一个好系统的重要标志。
 
2.Long method
 
它是传统结构化的“遗毒”。一个方法应当具有自我独立的意图,不要把几个意图放在一起。 ......

招聘银行项目JAVA开发工程师

     主要是做各地银行的外围系统,例如电子汇票、反洗钱系统等,有兴趣的可以加我QQ(429177125)具体聊,面试地点在北京市海淀区魏公村。
具体如下:
Java工作经验,2-3年
         软性要求: 以下工作经验之一者优先。1、 有银行工作经 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号