【问题标题】:How to implement equals without exposing fields?如何在不暴露字段的情况下实现equals?
【发布时间】:2016-08-01 15:06:39
【问题描述】:

假设我有一个Dog 类,它有一个字段private final int age 和一个方法public Dog ageBy(Time time),每次调用它都会返回狗的新实例。 Dog 类不仅是不可变的,而且没有任何 get 方法来返回它的年龄,换句话说,狗的合同不允许他说出他的年龄(为什么?因为没有会说话的狗),他只能“吠”、“睡觉”和做其他狗的事。

但是Dog可以按年龄和其他狗比较。为此,我需要覆盖 Dog 类中的 public equals(Object o) 方法。但问题是没有办法比较它,因为我无法访问经过的狗年龄。

问题:如何在不暴露对象的任何字段的情况下实现equals方法?

【问题讨论】:

  • 所有Dog 实例都可以访问其他Dog 实例的private 字段。
  • 谢谢,我不知道 :)

标签: java


【解决方案1】:

任何方法都可以访问同一个类的private字段,所以你可以写equals直接访问字段,不需要getter。

这是一个例子:

public class Point {
    private int x;
    private int y;

    public Point (int x, int y) {
        this.x = x;
        this.y = y;
    }

    public boolean equals(Object obj) {
       // Test for null, and type
       ...
       Point p = (Point) obj;
       return x == p.x && y == p.y;
    }

【讨论】:

    【解决方案2】:

    一个对象可以访问同一类的其他对象的private实例,因此您不需要equals中的getter。

    【讨论】:

      猜你喜欢
      • 2017-07-22
      • 2010-09-14
      • 2019-07-13
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      相关资源
      最近更新 更多