`
翅膀
  • 浏览: 23538 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

java编程时要遵循的一些原则

阅读更多
最近看了Effective Java这本书,感觉受益非浅。我把一些原则写了下来,希望能给大家一些帮助.
1.在改写equals的时候请遵守通用约定
  在讨论这个问题的时候,先要确定下在什么时候要改写Object.equals.
  当一个类有自己特有的“逻辑相等”概念,而且超类也没有改写equals以实现期望的行为,这时我们就
  需要改写equals方法了。但在改写equals方法时,必须要遵守对equals的通用约定,否则,我们改写的类
  将无法与其他类进行正常的工作,比较List,Map等集合方法,而且这种问题很难排查。
  这些通用约定如下
  1).自反性:对于任意的引用值x,x.equals(x)一定为true
  2).对称性:对于任意的引用值x和y,当且仅当x.equals(y)返回true时,y.equals(x)也一定要返回true
  3).传递性:对于任意的引用值x,y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么
     x.equals(z)也一定返回true
  4).一致性:对于任意的引用值x和y,如果用于equals比较的对象信息没有被修改的话,那么,多次调用x.equals(y)
     要么一致地返回true,要么一致地返回false
  5).对于任意的非空引用值x,x.equals(null)一定返回false.
  这些约定来自于java.lang.Object规范,看了这些规范,是不是感觉到写equals都这么麻烦,还得要逐个看看是否
  符合了这些规范,其实,这也并不难解决,只要下在的过程去实现equals方法,这些规范一般都会自然满足.
  1)使用==操作符检查“实参是否为指向对象的一个引用”
  2)使用instanceof操作符检查“实参是否为正确的类型”
  3)把实参转换到正确的类型
  4)对于该类中的每一个“关键”域,检查实参中的域与当前对象中对应的域值是否匹配
  5)当你改写equals的时候,总是要改写hashCode   (这条我会在后面讲到)
  6)不要企图让equals方法过于聪明
  7)不要使equals方法依赖于不可靠的资源
 不要将equals声明中的Object对象替换为其他类型,也就是不要将equals(Object o)改为equals(MyClass c)
分享到:
评论
1 楼 翅膀 2007-07-07  
2.在改写equals的时候总是要改写hashCode     (不知道有多少人知道hashCode的作用)
  在每个改写了equals方法的类中,必须也要改写hashCode方法。如果不这样的话,就会违反Object.hashCode的通用约定,
  这个类就会在所有基于散列值的集合类中无法正常工作,包括HashMap,HashSet和Hashtable
  举个例子。
  public class MyClass {
      private int x;
      private int y;
      public MyClass() {
      }
      public MyClass(int x,int y) {
         this.x=x;
         this.y=y;
      }
      public boolean equals(Object x) {
         if (x==null) {
            return false;
         }
         if (!(x instanceof MyClass)) {
            return false;
         }
         MyClass m = (MyClass)x;
         return m.x==this.x && m.y==this.y;
      }
  }
  Map p = new HashMap();
  p.put(new MyClass(33,44),"Test");
  在这个p中,你想通过p.get(new MyClass(33,44))去得到"Test",但实际上返回的是null,因为这个类没有重载hashCode方法,
虽然他们使用equals方法会得到true,但这两个实现是放在不同的散列桶里的。
  如果给这个类重载hashCode方法,则会得到我们想要的结果,代码如下:
  public int hashCode() {
     return 1;
  }
  上面的hashCode方法是合法的,但在实际中,是永远也不会使用的,因为这个方法使所有的对象都得到相同的散列值,每个对象
  都会被映射到同一个散列桶中,这个散列表就退化为了链表。那如何能够做一个比较好的散列值呢。按以下的方法做,一般都可

以生成比较好的散列值
  1.把某个非零常数值,比如17,保存在一个变量里,比如:int temp=17;
  2.对于对象中的每个关键值,完成以下步骤
    a.计算每个值的散列码c
      1)如果该值是boolean类型,则计算(f?0:1)
      2)如果是byte,char,short或者int,则计算(int)f;
      3)如果是long,则计算(int)(f^(f>>>32))
      4)如果是float,则计算Float.floatToIntBits(f);
      5)如果是一个对象引用,则同样递归调用对象的hashCode.
      6)如果是一个数组,则处理每个元素。
    b.按照下面公式,把步骤a中计算到的散列码c组合到结果中
      temp = 37*temp+c;
  

   所以上面的类实现hashCode方法如下
   public int hashCode() {
      int temp=17;
      temp = 37*temp+x;
      temp = 37*temp+y;
      return temp;
   }
 
   但在实际中,一些对象的关键值非常多,如果每次调用hashCode()都要经过计算,肯定会费很多资源,如果这样,则可以定义

一个属性值,把计算结果放到这个属性值就可以了。代码如下:
   private int hashCode = 0;
   public int hashCode() {
      if (hashCode==0) {
        int temp=17;
        temp = 37*temp+x;
        temp = 37*temp+y;
        hashCode = temp;
      }
      return hashCode;
   }

相关推荐

    java编程规范编程原则

    本文将详细介绍Java编程过程中应该遵循的一些核心原则与规范,包括但不限于命名约定、MVC模式以及其他重要的编程指南。 #### 二、命名约定 在Java编程中,合理的命名可以极大地提高代码的可读性和可维护性。下面...

    java并发编程:设计原则与模式.rar

    《Java并发编程:设计原则与模式》是一本深入探讨Java多线程编程的书籍,它涵盖了并发编程中的关键概念、原则和模式。在Java中,并发处理是优化应用程序性能、提高资源利用率的重要手段,尤其在现代多核处理器的环境...

    Java并发编程:设计原则与模式(第二版)-3

    《Java并发编程:设计原则与模式(第二版)》是一本深入探讨Java多线程编程技术的权威著作。这本书详细阐述了在Java平台中进行高效并发处理的关键概念、设计原则和实用模式。以下是对该书内容的一些核心知识点的概述...

    java语法大全,java语法,java编程基础,java入门

    在“java编程基础”部分,会详细介绍如何编写和运行Java程序,包括JDK的安装、环境变量配置,以及使用IDE(如Eclipse、IntelliJ IDEA)进行开发。此外,还会讲解面向对象编程(OOP)的基本原则,如封装、继承和多态...

    java编写原则.txt

    具体到Java编程中,遵循这一原则可以通过继承和多态实现。例如,在设计系统时,应优先考虑抽象类或接口的定义,以便在后续开发中,通过继承这些抽象类或实现接口来增加新的行为,而无需改动原有的代码逻辑。这不仅...

    华为JAVA编程规范、编程军规

    以下是基于标题“华为JAVA编程规范、编程军规”以及描述中提及的文档,提炼出的一些核心知识点: 1. **命名规范**:Java编程中的命名规则非常重要,华为编程规范强调了类名、方法名、变量名应清晰易懂,遵循驼峰...

    java程序设计课件

    Java程序设计是计算机科学中的一个重要领域,主要涉及使用Java编程语言进行软件开发。Java是一种广泛应用于服务器端、桌面应用、移动应用(尤其是Android平台)的高级编程语言。天津大学计算机系提供的这门java程序...

    Java 编程规则

    在编程时,应该遵循以下原则: 1. 为方法和类赋予表义性强的名字:方法名应该具有表义性强,避免使用缩写和难以理解的命名。 2. 为每个方法赋予单个退出点:每个方法应该只有一个退出点,以便于调试和维护。 3. ...

    java的里氏代换原则

    在Java编程中,它对于理解和构建可扩展、健壮的软件系统至关重要。简单来说,里氏代换原则(LSP,Liskov Substitution Principle)指的是在软件工程中,任何引用基类的地方都能被其子类替代,而不会改变程序原有的...

    java编程思想(pdf格式)

    《Java编程思想》是Java开发领域的一本经典著作,它深入浅出...以上就是《Java编程思想》一书中涉及的一些关键知识点,掌握这些将对理解Java编程有极大的帮助。通过阅读和实践,你可以逐步成长为一名熟练的Java开发者。

    JAVA编程规范.pdf

    《JAVA编程规范》是一份详细指导JAVA开发人员遵循的编程准则和技术标准的文档,旨在提升代码质量和团队协作效率。这份文档适用于首都信息发展股份有限公司电子社区事业部的所有软件开发人员,他们必须遵循这些规范...

    计算机软件开发的Java编程语言及应用——评《Java编程方法论》.pdf

    2. **可移植性**:Java遵循“一次编写,到处运行”的原则,由于其跨平台的特性,使得Java编写的程序可以在任何支持Java的设备上运行,无需重新编译。 3. **针对性**:Java设计时考虑了多种应用场景,无论是大型企业...

    Java程序性能优化 让你的Java程序更快、更稳定附本书示例代码(清晰版)

    Java程序性能优化是每个开发人员都需要关注的重要领域,特别是在企业级应用中,高效稳定的Java程序能够显著提升用户体验,降低服务器资源消耗。这本书“Java程序性能优化 让你的Java程序更快、更稳定”提供了深入的...

    java 的换行原则

    Java作为一种广泛使用的编程语言,其编码规范不仅涉及到语法的正确性,还包括代码的格式化、命名规则以及换行原则等,这些都是为了提高代码的质量和可维护性。下面我们将详细探讨Java的换行原则,这不仅是Java编译...

    JAVA开闭原则

    这一原则不仅适用于JAVA语言,实际上在多种编程语言和软件开发中都具有广泛的应用。 ### 开闭原则的内涵 #### 扩展开放 - **功能可扩展性**:开闭原则要求设计的软件模块能够轻松地添加新功能,无需触及原始代码...

    java程序设计教学实施报告.pdf

    1. **总体安排**:教学活动遵循“练学思拓”的原则,强调实践、学习、思考和拓展,以实现知识的深度理解和灵活应用。 2. **实施过程** - **“练学思拓”**:通过案例分析、实践操作和问题讨论等方式,引导学生主动...

    java编程规范思想

    在Java编程领域,遵循一定的规范至关重要,因为它不仅有助于提高代码的可读性和可维护性,还能确保团队之间的合作更加顺畅。对于初学者和经验不足的Java程序员来说,理解并实践这些规范尤其重要。以下是一些核心的...

    java程序设计项目化教程

    在Java编程中,基础语法是关键。这包括但不限于变量、数据类型、运算符、控制结构(如if语句和循环)、函数、类和对象等概念。Java是一种面向对象的语言,因此理解类与对象的关系,以及如何通过封装、继承和多态来...

Global site tag (gtag.js) - Google Analytics