2011-09-29 38 views
7

Actualmente estoy creando un gran proyecto y, como tal, me gustaría que todo salga bien y sea lo más eficiente posible.Java - ¿Referencia o identificador del objeto?

En mi proyecto, tengo una clase llamada Equipos, que contiene un HashMap (Entero, Equipo) de objetos de Equipo. Cada instancia de Team tiene una ID única (entero).

También hay un objeto llamado Player. Cada instancia de Player se puede asignar a un Team (pero no siempre).

Ahora, me pregunto cuál sería la mejor manera de saber qué jugador del equipo A se asigna a:

-> Almacenar el ID del equipo en el reproductor (equipo de private int), esta identificación se utiliza entonces para obtener el Equipo de HashMap en Equipos.

-> tienda una referencia al Equipo de jugador (equipo Team privada)

¿Alguien sabe lo que es mejor, y lo son de, los contras y los peligros del pro más importante de cada uno?

Gracias!

+1

Depende completamente de su uso. En lugar de diseñar clases de forma aislada, intente diseñar para divisiones verticales de características. – leonm

Respuesta

6

Usar equipo de equipo privado! Otras clases no deberían necesitar conocer la identificación de un objeto a menos que haya una buena razón. No implemente una estructura de base de datos en Java. Java está diseñado para ser basado en Objetos, úselo de esa manera.

Hay un par de razones adicionales que debe contener la instancia Equipo:

  1. Podemos suponer que el jugador tendrá que tener acceso al objeto de equipo. Es mejor tener la instancia en lugar de tener que hacer una búsqueda.
  2. Si tiene IDs en lugar de instancias, es posible que no haya ninguna referencia a un objeto retenido y podría ser basura recolectada. Sé que probablemente no sucederá en su caso, ya que tiene todos los equipos en un mapa, pero sigue siendo un riesgo y, por lo tanto, debe evitarse.
+0

Gracias por la información. Tengo una pregunta más: ¿cuánta memoria toma una referencia a un objeto? – Insdeath

+0

http://stackoverflow.com/questions/4474114/java-how-much-memory-a-reference-implies – stivlo

+0

Muchas gracias :) – Insdeath

-1

¿Utiliza la base de datos? Si es así, almacena la identificación del equipo en el jugador, o si no, te sugiero que guardes la referencia del equipo.

+0

-1 No estoy de acuerdo. El hecho de que haya un DB en segundo plano y que la tabla esté usando un ID no es razón para usar un ID en el objeto. Hay muchas soluciones ORM (Hibernate) que lo hacen fácil. –

+0

Por lo tanto, he encontrado que lo que dije antes no es tan "correcto", y, sí, depende ... –

0

Obviamente es imposible decirlo con certeza sin conocer el contexto en el que se utilizará, pero desde la perspectiva del diseño del código, la expectativa "natural" es que un equipo contenga jugadores, por lo que es el equipo el que el jugador se opone, no al revés.

Si comienza a jugar con los ID y necesita almacenar un gran número de objetos diferentes, parece que busca más de una base de datos, en cuyo caso busque algo como HSQLDB si no desea salir. de Java.

+0

Creo que debería ser una conexión de dos vías. El equipo tendría una lista de Jugadores y el Jugador tendría el Equipo. Me gustaría determinar fácilmente cuántos jugadores hay en un equipo y en qué equipo está un jugador. –

0

El peligro potencial de utilizar la referencia de objeto como la clave en un HashMap (o cualquier mapa) es que, si se hace incorrectamente, puede convertirse en una pérdida de memoria.

Un objeto no será basura si todavía hay referencias a él. Si se usa como clave en un Mapa, se considera una referencia a ese objeto.

Puede solucionar este using WeakReference.

En la situación que describa, probablemente debería utilizar los objetos como claves, pero desconfíe de las condiciones anteriores.

+0

No, no uso una referencia como clave en el mapa; solo uso un número entero para identificar el objeto, por lo que esto no debería ser un problema. – Insdeath

+0

Ah, he entendido mal la pregunta ... consejo: utilice siempre ejemplos de código. ;-) –

0

private Team team es el camino a seguir entre los dos enfoques que menciona. Si almacena el Id, ¿qué sucederá si el HashMap se actualiza? Esto está creando dependencias innecesarias.

Cuestiones relacionadas