Effective java经验之谈,通用方法

对于通用方法,其实应用的场景是比较多的,我们在写一个类的时候,就要考虑是否要编写该方法的通用方法。这使得我们为以后该类的扩展性与使用方面提供很大的便利。

1.      覆盖equals时请遵守通用约定。自反性,对称性,传递性,一致性,非空性。编写子类equals的方法的时候,可以考虑是否可以用复合,不使用继承来解决问题。Instanceof进行参数检测,如果参数null,也将返回false。

2.      覆盖equals时总要覆盖hashCode。

1.对象属性不变化,返回的hashcode永远相等。

2.如果对象通过equals方法比较是相等的,那么调用这两个对象中任意一个对象的hashcode产生同样的结果

3.对象的equals方法比较不相等,这两个对象任意的hashcode不一样

       设计equals()

[1]使用instanceof操作符检查“实参是否为正确的类型”。

[2]对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域值。

[2.1]对于非float和double类型的原语类型域,使用==比较;

[2.2]对于对象引用域,递归调用equals方法;

[2.3]对于float域,使用Float.floatToIntBits(afloat)转换为int,再使用==比较;

[2.4]对于double域,使用Double.doubleToLongBits(adouble)转换为int,再使用==比较;

[2.5]对于数组域,调用Arrays.equals方法。

      设计hashCode()

[1]把某个非零常数值,例如17,保存在int变量result中;

[2]对于对象中每一个关键域f(指equals方法中考虑的每一个域):

[2.1]boolean型,计算(f ? 0 : 1);

[2.2]byte,char,short型,计算(int);

[2.3]long型,计算(int) (f ^ (f>>>32));

[2.4]float型,计算Float.floatToIntBits(afloat);

[2.5]double型,计算Double.doubleToLongBits(adouble)得到一个long,再[2.3];

[2.6]对象引用,递归调用它的hashCode方法;

[2.7]数组域,对其中每个元素调用它的hashCode方法。

[3]将上面计算得到的散列码保存到int变量c,然后执行 result=37*result+c;

[4]返回result。

 3.始终要覆盖toString方法。只有覆盖这个方法,其他例如Arrays.toString(),以及集合类的toString。当你某一个调用该类输出的时候,就会调用该类已经实现的toString。

4.谨慎的调用clone方法。当你为一个继承而设计的类的时候,如果无法提供安全受保护的clone,那么子类就不可能实现Cloneable,因为子类实现需要调用父类的clone。Clone方法中对可变引用对象的copy可以通过递归clone完成。总结来说,对于clone不直接使用,而采用拷贝构造器以及拷贝工厂的方案来代替他。即入参和返回都是同类。

5.考虑实现Comparable接口。对于该接口的约定参考着equals。该接口指出了实现类的内在排序,实现该接口的类,可以参与排序算法[Collections.sort()等]。可以利用该接口的约定简略代码,返回值正负与0,并不关心值是多少。

像博主这么逗比的人还有吗?(卖萌吗?)

时间: 2024-08-02 11:03:32

Effective java经验之谈,通用方法的相关文章

【总结】Effective java经验之谈,类与接口

转载请注明出处:http://blog.csdn.NET/supera_li/article/details/44940563 Effective Java系列 1.Effective java经验之谈,创建和销毁对象 2.Effective java经验之谈,泛型 3.Effective java经验之谈,类与接口 4.Effective java经验之谈,通用方法 5.Effective java经验之谈,枚举,注解,方法,通用设计,异常 6.Effective java经验之谈,并发编程

Effective java经验之谈,创建和销毁对象

关于Effective java 这本书,自己的一些总结性的思考.篇幅可能不按照目录来,因为自己喜欢先看哪一章就直接阅读了.不过能确定的是,每一章都会有总结.欢迎大家拍砖与补充. 1.      考虑用静态工厂的方法代替构造器.优点:有名字,不必每次创建对象,返回任何子类型对象,简洁的代码.缺点:该类将不能被子类化(复合大于继承,也是优点),不方便doc工具输出文档,一般约定的命名规则: valueOf  转换类型 getInstance 获得对象实例 newInstance 创建新的对象实例

Effective java经验之谈,枚举,注解,方法,通用设计,异常

这几章看的比较快,内容就如同标题一样比较容易理解,所以只有部分内容会在[]中解释,其他的就直接理解标题,并不影响阅读质量. 不过如果时间充足的话,还是仔细读一读原书的内容,相信还是有所收获的.主要最近自己想进入算法与机器学习部分,尽快结束这本书. 另一方面,讨论一些自己感兴趣的内容,我会将搞过的东西总结下.后面可能写一部分关于java字节码阅读以及编写的东西.只所以这么来, 是因为字节码编程还是非常用途实际的,这一"java编译语言"使得String与StringBuilder的性能对

Effective Java之通用程序设计

这一章里面讲的都是一些编码的小技巧,或者说是编码时建议遵守的一些原则,下面就一条一条来列举: 1.局部变量的作用域最小.这条规则的原因很简单,在用到局部变量的时候采取创建局部对象,这样便于阅读程序,同时,能够保证局部变量在使用完后能够尽快释放,同时,在创建局部变量时,最好对局部变量进行赋值,如果实在没有办法,可以用null代替. 2.用for-each代替传统的for循环.在JDK1.5之后,Java提供了for-each的循环方式来代替传统的迭代循环,包括集合对象以及数组对象的循环方式.for

Effective java经验之谈,类与接口

本章描述的是,自己在做系统重构的时候,阅读的章节,给自己在架构方面提供很大帮助.总结出一些干货分享一下啊啊啊~~主要应用场景是编写类与接口的时候需要注意的问题.每一章不一定按照顺序更新.欢迎拍砖补充. 1.类与成员的访问权限最小化.Public staticfinal 如果指向的是对象(数组也是对象),那么往往是错误的写法,[private static final  A=指向该对象,同时采用public static final指向A.clone()(A的副本)][private static

Effective Java 阅读笔记——方法

38:检查参数的有效性 每当编写方法或者构造器的时候,应该考虑它的参数有哪些限制,在方法的开头处对参数进行检查,并且把这些限制写入文档. 注意: 对于公有方法,应该使用@throws标签在文档中说明违反参数值限制会抛出的异常 对于非公有的方法,通常使用断言来检查他们的参数:断言如果失败,抛出AssertionError:如果没有起到作用,本质上也不会有成本开销 private void sort(long a[]){ assert a != null; } 对于构造函数中的,或者参数将会被保存,

Effective java经验之谈,泛型

对于泛型这一章,在起始写框架的时候,并没有注意细节,造成了很多方法或者类的错误设计.这本书在这点上弥补了我一个短板.大概的总结如下. 1.      请不要在新代码中使用原生态类型.其实也就是说List不带任何东西的原生态类型.原生态类型的出现是为了解决移植兼容性的.如果想编写出安全的代码,那么就使用泛型.这样可以在编译的时候,指出你是否使用正确.否则原生态类型将在运行期出现类无法转化的异常. 2.      消除非受检警告.格式良好安全的代码应当没有警告,或者让警告最小.如果能够确定非受检警告

Effective Java读书笔记(3对于所有对象都通用的方法)

3.1 覆盖equals时请遵守通用约定 什么时候应该覆盖Object.equals()方法呢? 如果类具有自己特有的"逻辑相等"概念(不同于对象等同的概念),而且超类还没有覆盖equals以实现期望的行为,这时我们就需要覆盖equals方法. Object.equals()方法具有自反性.对称性.传递性.一致性和与null比较返回false的特点. 实现高质量equals方法的诀窍: (1)使用==操作符检查"参数是否为这个对象的引用".如果是,则返回true,这

Effective Java 第三版——10. 重写equals方法时遵守通用约定

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 10. 重写equals方法时遵守通用约定 虽然Object是一个具体的类,但它主要是为继承而设计的.它的所有非 final方法(equals.hashCode.toStr