Как получить диспетчер объектов Java Singleton, чтобы вернуть любой тип объекта? - PullRequest
1 голос
/ 16 мая 2010

Я пишу интерактивную фантастическую игру на Java с нуля.В настоящее время я храню все ссылки на мои игровые объекты в хэш-карте в одиночном объекте с именем ObjectManager.ObjectManager имеет функцию get, которая принимает целочисленный идентификатор и возвращает соответствующую ссылку.Проблема в том, что он возвращает BaseObject, когда мне нужно вернуть подклассы BaseObject с большей функциональностью.

Итак, я до сих пор добавил функцию getEntity, которая возвращает BaseEntity (подкласс BaseObject).Однако, когда мне нужно, чтобы функция вернулась к объекту, который является подклассом BaseEntity, который добавил необходимые функции, мне нужно будет сделать другую функцию.Я знаю, что есть лучший способ, но я не знаю, что это.Я очень мало знаю о шаблонах дизайна, и я не уверен, какой из них использовать здесь.Я пытался передать «класс» в качестве параметра, но это никуда меня не привело.

Ответы [ 3 ]

2 голосов
/ 16 мая 2010

Используйте универсальный тип возврата, если у вас есть среда выполнения Java 5:

public <Entity extends BaseEntity> Entity getEntity(int ID){
    return (Entity)refMap.get(ID);
}
2 голосов
/ 16 мая 2010

Я бы не рекомендовал вам продолжать этот дизайн.

Google уничтожает синглтоны из их базы Java-кода ; может быть, это тоже хорошая идея для вас.

Звучит так, будто вы пытаетесь сделать что-то, что было хорошо сделано в ApplicationContext Spring. Вы пытаетесь написать настраиваемую, гибкую фабрику объектов. Это было сделано. Я бы посмотрел на механизмы инжекции зависимостей, такие как Spring и Guice. Даже если вы решите не использовать их, возможно, они могут предложить некоторое дизайнерское вдохновение.

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

0 голосов
/ 16 мая 2010

Эти два метода делают одно и то же; второй просто спасает вызывающего от принятия броска. Если вы не хотите создавать функцию для каждого подкласса, тогда один ответ прост: не надо. Вызывающий должен выполнить приведение, но он работает так же хорошо, как то, что вы делаете сейчас, функционально.

Вы можете одеть этот же подход в дженерики:

<U> U get(int id, Class<U> clazz) {
  return (U) refMap.get(id);
}

Но это мало спасает вызывающего, поскольку он просто передает объект Class вместо приведения.

Если вы не хотите, чтобы вызывающая сторона выполняла эту работу, вам нужно написать эти специализированные методы.

...