equals()方法的通用约定
自反性(reflexivity) x.equals(x)=true
对称性 x.equals(y)=true,则y.equals(x)=true
传递性 x.equals(y)=true ,y.equals(z)=true,则x.equals(z)=true
一致性 如果两个对象相等的话,则它们必须始终保持相等
非空性,所有对象都必须不等于null
改写equals必须改写hashCode,否则该类无法与基于hash的集合类一起工作
实现comparable接口,就可与集合框架协作。
若需要保持并扩展一个有comparable接口或者equals方法的类,需要编写另一个类,引用该类,并提供一个方法返回这个类(proxy)
具有公有的静态final数组几乎总是错误的
无论是clone还是readObject,都不能调用一个可改写的方法,不管是直接,还是间接的方式,因为它们在行为上类似构造函数,调用的方法可能还未初始化。
禁止子类化的方法
把这个类声明为final
把所有构造函数变成私有的或者包级私有的,并增加一些公有的静态工厂替代构造函数
因为客户端可以通过调用非可变对象的属性并加以修改,有可能导致数据矛盾不再有效,可以通过在构造函数加以约束及get方法中返回一个属性的clone
方法的参数类型优先使用接口而不是类,如用MAP代替hashtable
永远不要导出两个具有相同参数数目的重载方法,
返回零长度的数组而不是null
System.out.println(Arrays.asList(a)) 打印一个数组
Collection.sort(v) 按字母排序一个Vector
Collection.sort(v,String.CASE_INSENSITIVE_ORDER) 忽略大小写
要求精确的答案,避免使用float,double, 而用BigDecimal,或用int(9位以内),long(18位以内)但需要控制小数点
当进行字符串连接时,用StringBuffer替代String,效率更高
使用接口引用对象,如List sub=new Vector()
接口优先于反射
避免客户使用异常来判断状态,需要提供一个单独的状态测试方法或者当处于不适当的状态时返回一个可被识别的值如null
如果期望调用者能够恢复,则使用checked exception
用runtime exception指明程序错误
常被重用的异常
IllegalArgumentException 参数值不合适
IllegalStateException 状态非法
ConcurrentModificationException 单线程对象被并法地修改
UnsupportedOperationException
高层的实现应该捕获低层的异常,并同时抛出一个可按高层抽象进行解释的异常