【问题标题】:How should I override the equals method of an API class?我应该如何覆盖 API 类的 equals 方法?
【发布时间】:2013-01-09 09:47:46
【问题描述】:

我正在使用 libGDX API 的 Vector2 类,如果我想检查两个向量的相等性,我必须执行以下操作:

Vector2 vectA = new Vector2(0, 1);
Vector2 vectB = new Vector2(1, 1);

if (vectA.x == vectB.x && vectA.y == vectB.y) {
   return true;
}

这很不舒服,我正在考虑为这种情况创建一个 equals() 方法。哪个应该更好:

  1. 使用 equals(Vector2) 方法为 Vector2 类创建包装器
  2. 使用 equals(Vector2, Vector2) 方法创建 EqualUtil 类

第一个看起来更好(在我看来),但它可能不是一个“好”的解决方案,而另一个更干净但也有点简单。也欢迎不同的想法。

【问题讨论】:

    标签: java overriding wrapper


    【解决方案1】:

    是的,你应该这样做。

    在我看来,最好创建一个 Wrapper(你还应该重写 hashCode() 以匹配新行为)。

    这样做不仅会产生更具可读性的代码,还允许您使用集合,例如 HashSet 或其他依赖于 equals() 行为的方法。

    这在逻辑上也很有意义,因为您正在尝试创建一个提供特定对象数据的方法 - 还有什么更好的方式来显示它而不是作为 实例方法

    【讨论】:

      【解决方案2】:

      我将继续,在 Vector2 类中覆盖 equals()hashCode() 方法。

      来自 Joshua Bloch 第 -9 项

      当你覆盖equals时总是覆盖hashCode

      已编辑:

      向下滚动到第 45 页 Page 45: Item-9

      【讨论】:

        【解决方案3】:
        public interface CheckObject(){
        
        
        
          public abstract boolean and(CheckObject checkobject);
        }
        
        
        
        public abstract class AbstractObject()
            implements CheckObject
        {
        
            public AbstractObject()
            {
            }
        
        public abstract boolean and(CheckObject checkobject);
         protected void beforeObjectChecked(Object obj)
                throws IllegalArgumentException
            {
            }
        
        
        public class EqualUtil extends AbstractObject {
        
        private int point1;
        private int point2;
        }
        protected EqualUtil(int point1,int point2){
        
        this.point1=point1;
        this.point1=point2;
        }
        public  boolean and(CheckObject checkobject){
            beforeObjectChecked(checkobject);
            return(this.getPoint1()==checkobject.getpoint1() && this.getPoint2()==checkobject.getpoint2()));
        
        }
        
        
        public int getPoint1() {
            return point1;
        }
        
        public void setPoint1(int point1) {
            this.point1 = point1;
        }
        
        public int getPoint2() {
            return point2;
        }
        
        public void setPoint2(int point2) {
            this.point2 = point2;
        }
        

        现在你可以在主类中使用它

        【讨论】:

          【解决方案4】:

          当原始设计者出于某种原因没有包含新行为时,包装器是一种很好且易于理解的添加新行为的方式。鉴于原始 API 类仅使用 java.lang.object equals 方法,创建包装器对我来说似乎是一个明智的选择。

          【讨论】:

          • 如上所述,你也应该重写 hashCode。
          猜你喜欢
          • 1970-01-01
          • 2014-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-27
          • 1970-01-01
          • 1970-01-01
          • 2013-08-20
          相关资源
          最近更新 更多