美文网首页effective java
第8条-覆盖equals时请遵守通用约定

第8条-覆盖equals时请遵守通用约定

作者: 熊熊要更努力 | 来源:发表于2018-02-01 15:50 被阅读1次

    类是是私有的或是包级私有的,可以确定它的equals方法永远不会被调用。
    equals实现了等价关系

    1. 自反性
    2. 对称性
    3. 传递性
      我们无法在拓展可实例化的类的同时,既增加新的值组件,同时又保留equals约定
      里式替换原则认为,一个类型的任何主要属性也将适用于它的子类型。因此认为为该类型编写的任何方法,在它的子类型也应该同样运行得很好。
      虽然没有一条令人满意的方法可以既拓展不可实例化的类,又增加值组件,但还是有一条不错的权宜之计:复合优先于继承

    我们不再让ColorPoint拓展Point,而是在ColorPoint中加入一个私有的Point域,以及一个公有的视图。该方法返回一个与该有色点处在相同位置的普通Point对象。

        public class ColorPoint
        {
            private final Point point;
            private final Color color;
    
            public ColorPoint(int x, int y,Color color)
            {
                if(color == null)
                    throw new NULLPointException();
                point= new Point(x,y);
                this.color = color;
            }
    
            public Point asPoint()
            {
                return point;
            }
    
            @Override
            public Boolean equlas(Object o)
            {
                if(!o istanceOf ColorPoint)
                    return false;
                ColorPoint cp = (ColorPoint) o;
                return cp.point.equals(point) && cp.color.equals(color);
                
            }
    
    
        }
    

    在JAVA平台库中,有一些类拓展了可实例化的类,并添加了新的组件。例如java.sql.TimeStamp对java.util.Date进行了拓展,并增加了nanoseconds域。TimeStamps的equals实现确实违反了对称性,如果TimeStamp和Date对象被用于用一个集合中,或者以其他方式被混合在一起,则会引起不正确的行为。
    可以在一个抽象类中增加新的值组件,而不会违反equals约定。

    1. 一致性
      无论类是否不可变的,都不要使equals方法依赖于不可靠的资源。
    2. 非空性
      所有的对象都必须不等于null。
      实现高质量equals方法的诀窍:
    • 使用==操作符检查“参数是否未正确的类型”
    • 使用instanceof操作符检查“参数是否为正确的类型”
    • 把参数个数转换成正确的类型
    • 对于该类中的每个“关键”域,检查参数中的域是否与该对象中对应的域相匹配。
      对于既不是float也不对double类型的基本类型域,可以使用==操作符进行笔记;对于对象引用域,可以递归地调用equals方法;对于float与,可以使用Float.compare方法。对于double域,则使用Double.compare。对于float域和double域进行特殊处理是有必要的。

    equals一些注意点:

    • 覆盖equals时总要覆盖hashCode
    • 不要将equals声明中的Object对象替换为其他的类型。
    • 不要企图让equals方法归于智能

    相关文章

      网友评论

        本文标题:第8条-覆盖equals时请遵守通用约定

        本文链接:https://www.haomeiwen.com/subject/dvedzxtx.html