开发者社区> 问答> 正文

为每个新类分配唯一的ID(不是实例!)

我在想,是否有可能为每个新类(而不是实例!)分配一个唯一的ID。

我的意思示例:

public class ChildObjectOne extends SuperClass {}
public class ChildObjectTwo extends SuperClass {}

public SuperClass {
   private final int ID;

   public SuperClass() {
      this.ID = newID();
   }
}

final ChildObjectOne childObjectOne = new ChildObjectOne();
final ChildObjectTwo childObjectTwo = new ChildObjectTwo();

System.out.println(childObjectOne.getID()); //prints 1
System.out.println(childObjectOne.getID()); //prints 2

childObjectOne = new ChildObjectOne();
childObjectTwo = new ChildObjectTwo();

System.out.println(childObjectOne.getID()); //prints 3
System.out.println(childObjectOne.getID()); //prints 4

我要它执行的是再次打印1和2。它应该为每个新类生成一个新的ID,但是如果我创建该类的新实例,则希望该ID保持不变。

我尝试使用泛型来实现此目的:

public SuperClass<T> {
   private static int ID;

   public SuperClass() {
      this.ID = newID();
   }
}

public class ChildObjectOne extends SuperClass<ChildObjectOne> {}
public class ChildObjectTwo extends SuperClass<ChildObjectTwo> {}

我希望,将通过不同的T作为新课程算进去,但这是行不通的。相反,该ID是设置的最后一个ID。

如何实现这种身份识别系统?

问题来源:Stack Overflow

展开
收起
montos 2020-03-23 16:01:13 453 0
1 条回答
写回答
取消 提交回答
  • 为了扩展我的评论,类名将为您提供一个唯一的String ID。如果您希望该ID为数字,则可以执行以下操作:

    class IdGenerator{
        private static int counter = 0;
        private static HashMap<String,Integer> classIdMap = new HashMap<>();
    
        public static synchronized int getId(Class clazz){
            if (classIdMap.containsKey(clazz.getName())) {
                return classIdMap.get(clazz.getName());
            } else {
                classIdMap.put(clazz.getName(), ++counter);
                return counter;
            }
        }
    }
    

    然后从您的课程中,您将执行以下操作:

    IdGenerator.getId(this.getClass());
    

    每次运行应用程序时,生成的ID 可能会不同,这取决于其结构。例如:

    Scanner in = new Scanner(System.in);
    if (in.nextInt() < 100) {
        System.out.println("a = " + new Aclass().id); // a = 1
        System.out.println("b = " + new Bclass().id); // b = 2
    } else {
        System.out.println("b = " + new Bclass().id); // b = 1
        System.out.println("a = " + new Aclass().id); // a = 2
    }
    

    回答来源:Stack Overflow

    2020-03-23 16:02:10
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
对象的生命期管理 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载