【发布时间】:2015-04-18 08:53:37
【问题描述】:
我有LatLotoTicket.java:
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class LatLotoTicket {
private static int counterID = 0;
private final int id = counterID++;
private final String address;
private final Set<Integer> userNumbers;
public LatLotoTicket(String address, Set<Integer> userNumbers) {
this.address = address;
this.userNumbers = userNumbers;
}
public LatLotoTicket(LatLotoTicket ticket) {
this.address = ticket.address;
this.userNumbers = ticket.getUserNumbers();
}
public String getAddress() {
return address;
}
public Set<Integer> getUserNumbers() {
return new HashSet<>(userNumbers);
}
@Override
public boolean equals(Object o) {
if(this == o) return true;
if(o == null || getClass() != o.getClass()) return false;
LatLotoTicket that = (LatLotoTicket) o;
return Objects.deepEquals(this.id, that.id);
}
@Override
public int hashCode() {
return Objects.hashCode(id);
}
}
我想我可以制作一个扩展这个LatLotoTicket 类的模板类。并在那里使 id 唯一并提供自己的 hashCode 和 equals 方法,但我不知道如何使每个模板都有自己的静态 idCounter 和 id 实例。
我尝试制作具有以下内容的模板类:
-
classIDCounter- with 将为扩展此对象的每个新类分配id。 -
classID- 这将避免将两个不同的对象与相同的id进行比较。 -
IDCounter- 分别计算每个类的单个对象id -
id- 包含每个对象的id
Foo 和 Bar 类:
public class Foo extends Unique<Foo> {
public Foo() {
System.out.println("Object ID "super.id + " class id " + super.classID)
}
}
public class Bar extends Unique<Bar> {
public Foo() {
System.out.println("Object ID "super.id + " class id " + super.classID)
}
}
在 main.java 中:
Foo foo1 = new Foo(); // Object ID 1 class id 1
Foo foo2 = new Foo(); // Object ID 2 class id 1
Bar bar1 = new Bar(); // Object ID 1 class id 2
Bar bar2 = new Bar(); // Object ID 2 class id 2
Foo foo3 = new Foo(); // Object ID 3 class id 1
我走了这么远(基本上什么都没有),现在我不知道该怎么办。 Unique.java:
import java.util.Objects;
public class Unique<Child> {
private static int classIDCounter = 0;
private final int classID = classIDCounter++;
private static int IDCounter = 0;
private final int id = IDCounter++;
@Override
public boolean equals(Object o) {
if(this == o) return true;
if(o == null || getClass() != o.getClass()) return false;
Unique unique = (Unique) o;
return Objects.deepEquals(classID, unique.classID);
}
@Override
public int hashCode() {
int result = classID;
result = 31 * result + id;
return result;
}
}
我怎样才能做到这一点?还有没有内置的类可以做到这一点?
我正在使用 JAVA 8。
【问题讨论】: