2011-09-29 11 views
7

Attualmente sto creando un grande progetto, e come tale mi piacerebbe che tutto avesse funzionato molto bene e nel modo più efficiente possibile.Java - Riferimento oggetto o identificatore?

Nel mio progetto, ho una classe chiamata Teams, che contiene un HashMap (Integer, Team) di oggetti Team. Ogni istanza del team ha un ID univoco (intero).

C'è anche un oggetto chiamato Player. Ogni istanza di giocatore può essere assegnata a una squadra (ma non sempre).

Ora, mi chiedo che cosa l'approccio migliore sarebbe quello di sapere che cosa squadra un giocatore viene assegnato a:

-> memorizzare l'ID della squadra nella Player (squadra private int), questo ID viene poi utilizzato per ottenere la squadra dalla HashMap in squadre.

-> Conservare un riferimento al Team Player (squadra Team privato)

Qualcuno sa che è meglio, e quali sono del, con e di pericoli pro più importante di ciascuno?

Grazie!

+1

Dipende interamente dal tuo caso. Piuttosto che progettare classi isolate, prova e progetta per sezioni verticali di funzionalità. – leonm

risposta

6

Utilizzare team privato! Altre classi non dovrebbero avere bisogno di conoscere l'ID di un oggetto a meno che non ci sia una buona ragione. Non implementare una struttura del database in Java. Java è progettato per essere basato su oggetti, usarlo in questo modo.

ci sono un paio di ragioni aggiuntive si dovrebbe tenere l'istanza della squadra:

  1. si può supporre che il Lettore avrà bisogno di accedere all'oggetto Team. È meglio avere l'istanza piuttosto che dover fare una ricerca.
  2. Se si trattengono gli ID anziché le istanze, potrebbe non esserci alcun riferimento a un oggetto trattenuto e potrebbe essere sottoposto a Garbage Collection. So che probabilmente non accadrà nel tuo caso dal momento che tratti tutte le squadre in una Mappa, ma è ancora un rischio e quindi dovrebbe essere evitato.
+0

Grazie per le informazioni. Ho solo un'altra domanda: quanta memoria fa un riferimento a un oggetto? – Insdeath

+0

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

+0

Grazie mille :) – Insdeath

-1

Si utilizza il database? In tal caso, memorizza l'ID della squadra nel giocatore, oppure ti suggerisco di memorizzare il riferimento della squadra.

+0

-1 Non accetto. Solo perché c'è un DB in background e la tabella sta usando un ID non c'è motivo di usare un ID nell'oggetto. Ci sono molte soluzioni ORM (Hibernate) che lo rendono facile. –

+0

Quindi, ho trovato che quello che ho detto prima non è così "giusto", e, sì, dipende ... –

0

Ovviamente è impossibile dirlo con certezza qui senza conoscere il contesto in cui verrà utilizzato, ma da una prospettiva di progettazione del codice, l'aspettativa "naturale" è che una squadra contenga giocatori, quindi è la squadra a fare riferimento il giocatore oggetti, non il contrario.

Se inizi a fare scherzi con gli ID e hai bisogno di memorizzare un gran numero di oggetti diversi, sembra che tu stia cercando più di un database, nel qual caso guarda qualcosa come HSQLDB se non vuoi uscire di Java.

+0

Penserei che avrebbe dovuto essere una connessione a due vie. La squadra avrebbe tenuto una lista di giocatori e il giocatore avrebbe tenuto la squadra. Vorrei determinare facilmente quanti giocatori sono in una squadra e in quale squadra è attivo un giocatore. –

0

Il potenziale pericolo con l'utilizzo del riferimento oggetto come chiave in una HashMap (o qualsiasi mappa) è che può, se fatto in modo non corretto, diventare una perdita di memoria.

Un oggetto non verrà raccolto automaticamente se vi sono ancora riferimenti ad esso. Se usato come chiave in una mappa, viene considerato un riferimento a quell'oggetto.

È possibile aggirare questo using WeakReference.

Nella situazione che descrivi probabilmente dovresti usare gli oggetti come chiavi, ma fai attenzione alle condizioni di cui sopra.

+0

No, non uso un riferimento come chiave nella mappa - utilizzo solo un numero intero per identificare l'oggetto, quindi questo non dovrebbe essere un problema. – Insdeath

+0

Ah ho frainteso la domanda ... consiglio: usa sempre esempi di codice. ;-) –

0

private Team team è la via da seguire tra i due approcci che hai citato. Se memorizzi l'Id, cosa succederà se la HashMap viene aggiornata? Questo sta creando dipendenze non necessarie.

Problemi correlati