EffectiveJava
开发守则
AWM优先给我
这个作者很懒,什么都没留下…
展开
-
第10条 始终要覆盖toString
第10条 始终要覆盖toString不覆盖的缺点默认的toSring返回类名@散列码,如PhoneNumber@163b91默认实现产生的消息难以理解提供好的toString不仅有益于该类实例,也有益于包含这些实例的引用对象,特别是集合对象实践toString被返回的字符串应该简洁,信息丰富,易于阅读toString方法应该返回对象中包含的所有值的关注的信息请在文档明确注明你的意图。如果指定返回格式,请严格执行为toString返回值中包含的所有信息供编程式的访问途径...原创 2021-08-26 16:52:19 · 65 阅读 · 0 评论 -
第9条 覆盖equals时总要覆盖hashCode
第9条 覆盖equals时总要覆盖hashCode定义:在每个覆盖了equals方法的类中,也必须覆盖hashCode方法JavaSE6的约定1.程序的一次执行中,equals比较用到的信息没被修改,hashCode必须返回同一整数。2.同一程序多次执行过程中,每次执行返回的整数可以不一致。3.两个对象的equals方法比较是相等的,两个对象中的任意一个hashCode必须产生相同整数。4.两个对象的equals方法不相等,hashCode不一定不相等。如果不覆盖hashCode的结果原创 2021-08-26 16:51:22 · 108 阅读 · 0 评论 -
第8条 覆盖equals时请遵守通用约定
第8条 覆盖equals时请遵守通用约定不应该覆盖equals的情况类的每个实例本质上都是唯一的不关心类是否提供了逻辑相等的测试功能超类已经覆盖了equals,从超类继承过来的行为对于子类也是合适的类是私有的或者是包级私有的,可以确定它的equals方法永远不会被调用覆盖equals需遵循自反性 x.equals(x)必须返回true对称性 当x.equals(y)返回true时,y.equals(x)必须返回true传递性 如果x.equals(y)返回true且y.equals(原创 2021-08-17 09:52:04 · 85 阅读 · 0 评论 -
第7条 避免使用终结方法
第七条 避免使用终结方法定义:给类定义finalize()方法,就是我们所说的终结方法。使用该机制你可以定义一些特殊的操作,这些操作在一个对象将要被垃圾回收程序释放时执行,因为垃圾回收该对象前会调用其所属类的finalize()方法(如果有定义的话)。缺点1.不能保证会被及时地执行且有可能JVM根本不去执行,执行情况与JVM的垃圾回收算法有关。2.线程优先级低,它只有等所有线程都挂起等待该内存释放的时候才会开始释放该对象的内存,此时才会执行finalize()方法。3.严重的性能损原创 2021-08-13 16:36:37 · 64 阅读 · 0 评论 -
第6条 消除过期的对象引用
第6条 消除过期的对象引用自己管理内存的类举例:实现push和pop的Stack类,维护的内部元素列表在pop时未置空应对: 一旦数组元素不再有效,手工清空对象缓存对象放入缓存,被遗忘采用WeakHashMap代表缓存后台线程清理添加新条目的时候清理监听器和其他回调客户端在API注册回调却没显式取消注册只保存弱引用,如WeakHashMap...原创 2021-08-13 16:35:49 · 75 阅读 · 0 评论 -
第5条 避免创建不必要的对象
第5条 避免创建不必要的对象定义:充分利用可以重用的对象1.如果对象是不可变的,它始终可以被重用String s=new String(“Str”); 这种方法执行时每次都会创建一个新的String实例(一般也没人这么写)。改进为:String s=“Str”;因为在java中,String是被final修饰的(public final class String),这种方法只用了一个String实例,而不是每次执行的时候都创建一个新的实例,可以保证,对于所有在同一个虚拟机中运行的代码,只要他原创 2021-08-13 16:34:20 · 61 阅读 · 0 评论 -
第4条 通过私有构造器强化不可实例化的能力
第4条 通过私有构造器强化不可实例化的能力实例化无意义的工具类,让这个类包含私有构造器。缺点不能被子类化。所有的构造器都必须显示或者隐式的调用超类的构造器,这种情况下,子类就没有可访问的超类构造器可调用了。...原创 2021-08-13 16:33:28 · 82 阅读 · 0 评论 -
第3条 用私有构造器或者枚举类型强化Singleton属性
第3条 用私有构造器或者枚举类型强化Singleton属性(单例模式)定义:Singleton指仅仅被实例化一次的类。实现方法1:私有构造器,公有的静态final域,私有的构造器仅被调用一次,用来实例化公有的静态final域。注意:享有特权的客户端可以借助AccessibleObject.setAccessible方法,通过反射机制调用私有的构造器。解决方案:修改构造器,让它在被要求创建第二个实例的时候抛出异常。实现方法2:静态工厂方法,对于静态方法.getInstance的所有调用,都原创 2021-08-13 16:31:06 · 190 阅读 · 0 评论 -
第2条 遇到多个构造器参数时考虑用构建器(Build)
第2条 遇到多个构造器参数时考虑用构建器(Build)适用构造器/静态工厂具有很多个参数优势可以有多个可变参数灵活,可以单个builder构建多个对象设置了参数的builder生成了一个很好的抽象工厂缺点创建构造器有开销冗长替代方案重叠构造器多参数情形代码难编写,可读性差JavaBeans模式构造过程分离需额外考虑线程安全 手动freeze比较笨拙...原创 2021-08-12 19:10:32 · 77 阅读 · 0 评论 -
第1条 考虑用静态工厂方法代替构造器(静态工厂模式)
第1条 考虑用静态工厂方法代替构造器(静态工厂模式)定义:像Fragment fragment = MyFragment.newIntance();这样不通过new,而用一个静态方法对外提供自身实例的方法。优势:优势1:工厂方法有名称(使用工厂产生对象,比构造器更加自由,不用专门去找使用哪一个构造器,直接通过工厂名就可以产生想要的对象),构造方法就算参数不同,new对象的时候使用的也是对象名称。优势2:工厂产生的对象可以复用(相当于单例模式),如果是这样产生的对象,可以使用==代替equal原创 2021-08-12 19:06:00 · 95 阅读 · 0 评论