我有一个包含许多扩展子类的类:
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,或者我必须自己做,在每个构造函数类中给出不同的数字?
如果没有,是否有更简单的方法来完成我想要做的事情?
答案 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());
}
做这个工作?