Лучший способ преобразовать «Простое имя класса» в «Полное имя класса» в Object в Java - PullRequest
1 голос
/ 08 апреля 2009

Допустим, у меня есть объект, который он хранит в базе данных:

com.test.dummy.Cat

Кошка имеет целочисленный идентификатор.

За пределами моего "мира" ссылка на объект - это строка вида:

Cat-433

Где 433 - идентификатор базы данных, присвоенный кошкам.

Когда я передаю строку, мне нужно найти ее в базе данных.

Итак, я делаю это:

String[] splitString = str.split("-");
String objectType = splitString[0];
Integer id = Integer.valueOf(splitString[1]);

Мой вопрос таков: как лучше всего получить от Cat до com.test.dummy.Cat , чтобы я мог выполнить Class.forName () для строки и найти этот объект в БД?

Я думал о каком-то XML-отображении или жестко закодированном чисто Java-отображении. Какие у меня варианты?

Ответы [ 3 ]

2 голосов
/ 08 апреля 2009

Если вы уже знаете, что собираетесь читать Cat из базы данных, почему ваш DAO для таблицы Cat не закодирован для создания нового Cat () перед заполнением его значениями, которые вы прочитали?

У вас будет фабрика, которая будет возвращать «DatabaseObject» для метода getDatabaseObject (ссылка на строку), который будет выполнять разбиение имени «Cat-433», используйте первую часть, чтобы решить, какой DAO вызывать, и вторая часть для передачи в качестве UID в методе DatabaseObject get(int uid); DAO.

2 голосов
/ 08 апреля 2009

Карта, как HashMap. Это может быть установлено в коде, или пара может быть прочитана из файла, используя для этого любой из нескольких классов (например, в Spring).

Но на более широком плане ваш план хрупок. Вы должны проанализировать строку, вы должны предположить, что вы никогда не будете использовать класс в другом пакете с тем же именем и т. Д.

Возможно, вам нужно переосмыслить то, что вы делаете, или, возможно, опубликовать в качестве вопроса вашу цель , а не вашу реализацию.

Комментарий от ОП:

Но так как я бы управлял отображением из SimpleName в ClassName, это действительно было бы проблемой? - cloutierm (2 минуты назад)

В очень простом игрушечном приложении эта может работать. В реальном приложении вы обнаружите, что используете библиотечные классы с одинаковым простым именем.

Или, другими словами, делая это, вы говорите: «Я никогда не буду использовать классы Spring clasess, Apache Commons или даже классы java.lang без необходимости просматривать мой код в поисках конфликтов имен». Чтобы избежать таких неизбежных классов, пакеты были разработаны.

1 голос
/ 17 апреля 2009

Предполагая, что ваши типы читаются во время выполнения, вы можете заполнить таблицу сопоставления автоматически, т.е.

public class Cat {
...
  static {
    mapping.put("Cat", "xyz.Cat");
  }
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...