Fork me on GitHub

effect_java_study

effect-java学习笔记

基本类型和装箱类型的选择

  • 优先使用基本类型而不是装箱的基本类型,也要注意无意识的自动装箱。

警惕内存泄露

  • 清空对象引用应该是例外而不是规范。
  • 当一个类自己管理内存时,程序员应该警惕内存泄漏问题。另一个常见的内存泄漏来源是缓存。

重写equals方法必须遵守的规定

equals方法实现了一个等价关系(equivalence relation)。它有以下这些属性:

  • 自反性:对于任何非空引用x,x.equals(x)必须返回true。
  • 对称性:对于任何非空引用x和y,如果且仅当y.equals(x)返回true时x.equals(y)必须返回true。
  • 传递性:对于任何非空引用x、y、z,如果x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)必须返回true。
  • 一致性:对于任何非空引用x和y,如果在equals比较中使用的信息没有修改,则x.equals(y)的多次调用必须始终返回true或始终返回false。
  • 对于任何非空引用x,x.equals(null)必须返回false。
  1. 当重写equals方法时,同时也要重写hashCode方法。
  2. 不要让equals方法试图太聪明。
  3. 在equal 时方法声明中,不要将参数Object替换成其他类型。

在每个类中,在重写 equals 方法的时侯,一定要重写 hashcode 方法

  1. 当在一个应用程序执行过程中,如果在equals方法比较中没有修改任何信息,在一个对象上重复调用hashCode方法时,它必须始终返回相同的值。从一个应用程序到另一个应用程序的每一次执行返回的值可以是不一致的。
  2. 如果两个对象根据equals(Object)方法比较是相等的,那么在两个对象上调用hashCode就必须产生的结果是相同的整数。
  3. 如果两个对象根据equals(Object)方法比较并不相等,则不要求在每个对象上调用hashCode都必须产生不同的结果。 但是,程序员应该意识到,为不相等的对象生成不同的结果可能会提高散列表(hash tables)的性能。
  • 当无法重写hashCode时,所违反第二个关键条款是:相等的对象必须具有相等的哈希码( hash codes)。
  • 不要试图从哈希码计算中排除重要的属性来提高性能。
  • 不要为hashCode返回的值提供详细的规范,因此客户端不能合理地依赖它; 你可以改变它的灵活性。

始终重写toString方法

接口仅用来定义类型

  1. 不在接口中定义常量,将常量放到与其紧密相关联的类或接口中,或将常量定义在工具类中,接口中最好仅保留类型的定义。
  2. (如果一个非final类实现了常量接口,那么此类的所有子类都会被该常量接口所污染)。
  3. 如果大量使用实用工具类导出的常量,则通过使用静态导入来限定具有类名的常量。

优先考虑静态成员类

嵌套类(nested class)是在另一个类中定义的类。 嵌套类应该只存在于其宿主类(enclosing class)中。 如果一个嵌套类在其他一些情况下是有用的,那么它应该是一个顶级类。 有四种嵌套类:静态成员类,非静态成员类,匿名类和局部类。 除了第一种以外,剩下的三种都被称为内部类(inner class)。

  • 静态成员类是最简单的嵌套类。 最好把它看作是一个普通的类,恰好在另一个类中声明,并且可以访问所有宿主类的成员,甚至是那些被声明为私有类的成员。 静态成员类是其宿主类的静态成员,并遵循与其他静态成员相同的可访问性规则。 如果它被声明为private,则只能在宿主类中访问,静态成员类的一个常见用途是作为公共帮助类,仅在与其外部类一起使用时才有用。
  • 非静态成员类实例和其宿主实例之间的关联是在创建成员类实例时建立的,并且之后不能被修改。 通常情况下,通过在宿主类的实例方法中调用非静态成员类构造方法来自动建立关联。 尽管很少有可能使用表达式enclosingInstance.new MemberClass(args)手动建立关联。 该关联在非静态成员类实例中占用了空间,并为其构建添加了时间开销。
  • 一个匿名类没有名字。 它不是其宿主类的成员。 它不是与其他成员一起声明,而是在使用时同时声明和实例化。 在表达式合法的代码中,匿名类是允许的。 当且仅当它们出现在非静态上下文中时,匿名类才会封装实例。 但是,即使它们出现在静态上下文中,它们也不能有除常量型变量之外的任何静态成员,这些常量型变量包括final的基本类型,或者初始化常量表达式的字符串属性。匿名类是创建小方法对象和处理对象的首选方法,但lambda表达式现在是首选。 匿名类的另一个常见用途是实现静态工厂方法。
  • 局部类是四种嵌套类中使用最少的。 一个局部类可以在任何可以声明局部变量的地方声明,并遵守相同的作用域规则。 局部类与其他类型的嵌套类具有共同的属性。 像成员类一样,他们有名字,可以重复使用。 就像匿名类一样,只有在非静态上下文中定义它们时,它们才会包含实例,并且它们不能包含静态成员。 像匿名类一样,应该保持简短,以免损害可读性。

永远不要将多个顶级类或接口放在一个源文件中。

-------------本文结束感谢您的阅读-------------
如果您对博主的原创满意,欢迎您继续支持下博主~