如何在每个课程扩展中获得唯一ID?

时间:2016-04-07 07:31:21

标签: java comparison identity

我有一个包含许多扩展子类的类:

class FirstImplementation extends Mother { [...]
class SecondImplementation extends Mother { [...]
class ThirdImplementation extends Mother { [...]

我想要做的是一种简单明了的方法来了解Mother类的两个实例是否具有相同的实现:

Mother   a = new FirstImplementation();
Mother   b = new SecondImplementation();
Mother   c = new FirstImplementation();

a.sameKindOf(b); // return false;
a.sameKindOf(c); // return true;

我的想法是在每个Mother实例中设置一个整数ID字段,然后在sameKindOf函数中进行比较:

public class Mother {
    private final int ID;

    protected Mother(int ID) {
        this.ID = ID;
    }

    public int getID() {
        return this.ID;
    }

    public boolean sameKindOf(Mother other) {
        return this.ID == other.getID();
    }
}

Mother的每个扩展都应使用精确的ID来调用Mother的构造函数。

我的问题是:有没有办法在每次创建新扩展时自动提供不同的ID,或者我必须自己做,在每个构造函数类中给出不同的数字?

如果没有,是否有更简单的方法来完成我想要做的事情?

3 个答案:

答案 0 :(得分:1)

如果您只对ID式解决方案感兴趣...请尝试使用以下机制:

Mother班级声明protected static int childClassesNumber;。它将存储所有已加载的唯一子项的数量:

class Mother {
  protected static int childClassesNumber = 0;
  private final int ID;

  protected Mother(int ID) {
    this.ID = ID;
  }

  public int getID() {
    return this.ID;
  }

  public boolean sameKindOf(Mother other) {
    return this.ID == other.getID();
  }
}

然后,为了确保每个孩子都获得唯一身份证,你应该在每个孩子身上使用这样的东西(这不好):

class ChildOne extends Mother {
  public static final int ID;

  static {
    ID = ++Mother.childClassesNumber;
  }

  public ChildOne() {
    super(ID);
  }
}

ID仅在课程加载阶段(仅一次)给出

和(例如)ChildTwo

class ChildTwo extends Mother {
  public static final int ID;

  static {
    ID = ++Mother.childClassesNumber;
  }

  public ChildTwo() {
    super(ID);
  }
}

之后,以下代码

System.out.println(new ChildOne().sameKindOf(new ChildOne()));
System.out.println(new ChildOne().sameKindOf(new ChildTwo()));

得到:

  

     

这种机制有一个很大的缺点 - 你应该在每个孩子中放置static初始化。样板代码等等......所以我建议你使用@Ash解决方案)

答案 1 :(得分:0)

查看java.util.UUID类及其静态工厂方法public static UUID nameUUIDFromBytes(byte[] name)。那是你在找什么?

答案 2 :(得分:0)

难道不

public boolean sameKindOf(Mother other) {
    return this.getClass().equals(other.getClass());
}

做这个工作?