我想创建一种情况,其中一组类(从相同的基类继承)都具有不同的唯一ID。 ID属于类,而不属于它的实例。 ID不应该对代码更改敏感(因此基于某些属性的ID的运行时计算是不可能的)。 此外,我需要它对类adition不敏感,这意味着,一旦一个类获得一个ID,即使我移动类,更改它的名称或使用代码,它也将是相同的ID 此外,我需要它是程序员证明,因此ID将自动生成(通过eclipse),如果意外地使用两次 - 我将得到一个错误。 如果可能的话,我想将ID连接到一个枚举,该枚举将为每个可能的ID提供唯一值,但这是次要目标。
有什么想法吗?
答案 0 :(得分:0)
您必须在基类和生成方法中创建缓存:
public class Base {
private static final Set<Integer> GENERATED_IDS = new HashSet<>();
protected static int generateId(Class<? extends Base> subClass){
final int id = subClass.getName().hashCode();
if(GENERATED_IDS.contains(id)){
throw new InstantiationError("id '" + id+ "' already used");
}
GENERATED_IDS.add(id);
return id;
}
}
我在这里使用了一个简单的getName().hashCode()
。对于您将要创建的每个课程,这将是独一无二的。 (没有类可以命名相同并放在同一个包中)
public class Sub extends Base {
public static final int ID = Base.generateId(Sub.class);
}
所以你有一个很好的id分布,实际上就是subClasses的Class对象的hashCodes。
注意:hashCode仍然可以变化,具体取决于默认的字符集