Назначьте уникальный идентификатор для каждого нового класса (не экземпляра!) - PullRequest
0 голосов
/ 16 марта 2020

Мне было интересно, можно ли назначить уникальный идентификатор для каждого нового класса (не экземпляра!).

Пример того, что я имею в виду:

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. Он должен генерировать новый идентификатор для каждого нового класса, но если я создаю новый экземпляр этого класса, я хочу, чтобы идентификатор оставался прежним.

Я пытался добиться этого с помощью обобщений:

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 как нового класса, но это не сработало. Вместо этого идентификатор является последним, который был установлен.

Как я могу добиться такого рода системы идентификации?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Чтобы расширить мой комментарий, имя класса даст вам уникальный идентификатор строки. Если вы хотите, чтобы этот идентификатор был числом, вы могли бы сделать что-то вроде этого:

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());

Сгенерированные идентификаторы могут не будет одинаковым каждый раз, когда вы запускаете свое приложение, в зависимости от того, как оно структурировано. Например:

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
}
1 голос
/ 16 марта 2020

Class::getName

Каждый класс в Java уже имеет уникальный идентификатор: полное имя класса. Вам не нужно добавлять идентификатор.

Получите доступ к полному имени, позвонив по номеру Class::getName.

Для класса:

String.class.getName()

"java .lang.String"

Для объекта (экземпляра) вызвать Object::getClass, а затем Class::getName.

customer.getClass().getName()

com.example.invoicing.Customer

...