+ - [建议42:让工具类不可实例化](#42_20)
	- [建议43:避免对象的浅拷贝](#43_24)
+ [建议44:推荐使用序列化实现对象的拷贝](#44_28)
+ - [建议45:覆写equals方法时不要识别不出自己](#45equals_32)
	- [建议46:equals应该考虑null值情景](#46equalsnull_36)
+ [建议47:在equals中使用getClass进行类型判断](#47equalsgetClass_40)
+ - [建议48:覆写equals方法必须覆写hashCode方法](#48equalshashCode_44)
	- [建议49:推荐覆写toString方法](#49toString_48)
+ [建议50:使用package-info类为包服务](#50packageinfo_52)
+ - [建议51:不要主动进行垃圾回收](#51_56)
  • 深入认识JVM
  • JVM内存分配,类加载
  • 创建对象的4种方法总结
  • 垃圾回收GC
  • JVM调优,Arthas使用
  • 认识多线程
  • 创建多线程方法+了解线程池
  • 多线程下-1非原子性问题即解决
  • 再论线程,创建、生命周期
  • 总结

引出

程序人生——Java中类、对象及方法的建议(2)


类、对象及方法

建议41:让多重继承成为现实

  • Java中一个类可以多种实现,但不能多重继承。使用成员内部类实现多重继承。内部类一个重要特性:内部类可以继承一个与外部类无关的类,保证了内部类的独立性,正是基于这一点,多重继承才会成为可能
建议42:让工具类不可实例化
  • 工具类的方法和属性都是静态的,不需要实例即可访问。**实现方式:**将构造函数设置为private,并且在构造函数中抛出Error错误异常
建议43:避免对象的浅拷贝
  • 浅拷贝存在对象属性拷贝不彻底的问题。对于只包含基本数据类型的类可以使用浅拷贝;而包含有对象变量的类需要使用序列化与反序列化机制实现深拷贝

建议44:推荐使用序列化实现对象的拷贝

  • 通过序列化方式来处理,在内存中通过字节流的拷贝来实现深拷贝。使用此方法进行对象拷贝时需注意两点:1、对象的内部属性都是可序列化的;2、注意方法和属性的特殊修饰符,比如final、static、transient变量的序列化问题都会影响拷贝效果。一个简单办法,使用Apache下的commons工具包中的SerializationUtils类,直接使用更加简洁方便
建议45:覆写equals方法时不要识别不出自己
  • 需要满足p.equals§返回为真,自反性
建议46:equals应该考虑null值情景
  • 覆写equals方法时需要判一下null,否则可能产生NullPointerException异常

建议47:在equals中使用getClass进行类型判断

  • 使用getClass方法来代替instanceof进行类型判断
建议48:覆写equals方法必须覆写hashCode方法
  • 需要两个相同对象的hashCode方法返回值相同,所以需要覆写hashCode方法,如果不覆写,两个不同对象的hashCode肯定不一样,简单实现hashCode方法,调用org.apache.commons.lang.builder包下的Hash码生成工具HashCodeBuilder
建议49:推荐覆写toString方法
  • 原始toString方法显示不人性化

建议50:使用package-info类为包服务

  • package-info类是专门为本包服务的,是一个特殊性主要体现在3个方面:1、它不能随便被创建;2、它服务的对象很特殊;3、package-info类不能有实现代码;package-info类的作用:1、声明友好类和包内访问常量;2、为在包上标注注解提供便利;3、提供包的整体注释说明
建议51:不要主动进行垃圾回收
  • 主动进行垃圾回收是一个非常危险的动作,因为System.gc要停止所有的响应(Stop 天河world),才能检查内存中是否有可回收的对象,所有的请求都会暂停

深入认识JVM

JVM内存分配,类加载