2013-03-01 5 views
5

Ho una variabile HashMap<MyClass,ArrayList<WeakReference<MyObject>>>.Posso confrontare le variabili WeakReference in java?

Eventhough weakrefences viene pulito dall'hashmap, voglio anche essere in grado di rimuovere manualmente "MyObject" da HashMap. Questo è un oggetto listener centrale.

quando aggiungo elementi alla arraylist che è collegato al valore della chiave hashmap principale, io uso .add(new WeakReference<MyObject>(owner))

quando voglio per rimuovere "sé" da un luogo esterno, io mando il "proprietario" come il parametro che è il vero oggetto. Quindi, come posso rimuovere questo oggetto manualmente dalla mia hashmap? Posso interrogare con un nuovo WeakReference generato dal parametro del proprietario in arrivo? Il vecchio "new WeakReference<MyObject>(owner)" e il nuovo "new WeakReference<MyObject>(owner)" saranno uguali? Quindi potrei rimuoverlo dall'hashmap.

+0

Qual è la chiave utilizzata per memorizzare i riferimenti deboli? Usa lo stesso tasto per rimuovere l'istanza di riferimento debole dalla mappa. –

+0

Non sta chiamando 'add' sulla mappa ma sulla' Lista'. –

+0

@NarendraPathai key è un enum che definisce il tipo di listener. Non riesco a rimuovere la chiave principale. devo rimuovere il listener da ArrayList. Supponiamo quindi che ci siano molte chiavi come "A_CHANGED, B_CHANGED". A_CHANGED può avere un numero illimitato di oggetti diversi che ascoltano l'evento A_CHANGED. Quindi non posso rimuovere tutti gli oggetti da A_CHANGED. – frankish

risposta

6

Il vecchio "nuovo WeakReference (proprietario)" e il nuovo "nuovo WeakReference (proprietario)" saranno uguali?

No, non saranno uguali. entrambi sono oggetti diversi e il metodo equals non viene sovrascritto nel Riferimento debole. Quindi, per impostazione predefinita controlla se entrambi i riferimenti sono uguali e non lo sono.

Suggerimento:

Map<MyClass,Map<String,WeakReference<MyObject>>> 

è possibile modificare la list ad un map e utilizzare alcuni ID genere di cose in oggetto come chiave per riferimento debole. E quando il proprietario chiama, utilizzare l'ID di quell'oggetto per rimuovere il riferimento debole.

+0

Quindi, devo restituire il WeakReference (proprietario) creato al proprietario e il proprietario manterrà il suo WeakReference? – frankish

+0

Essere uguali ed essere uguali è diverso. new String ("foo") è uguale a new String ("foo"), sebbene siano oggetti diversi. –

+0

@JBNizet si il mio male. Ho modificato il post per riflettere i cambiamenti. Grazie. –

4

No, perché né la WeakReference né la sua classe madre Reference sostituiscono il metodo equals(). Quindi eredita il metodo equals() da Oggetto, che considera solo due oggetti uguali se sono lo stesso oggetto.

+0

Hai qualche idea di ignorare gli uguali? Come lo implementeremo? – frankish

+0

Non so abbastanza sui riferimenti deboli per sapere se è una buona idea o meno di sottoclasse e sovrascrive equals() o no. Immagino che non sarebbe una buona idea, altrimenti sarebbe fatto direttamente in WeakReference. Fai scorrere l'elenco per trovare quello che stai cercando e rimuoverlo. Questo è ciò che l'elenco fa quando viene chiamato remove(). –

+0

Forse posso restituire il weakrefence al proprietario stesso quando tenta di aggiungersi a questo elenco? Quindi può usare direttamente quel riferimento per rimuovere se stesso? – frankish

2

L'opzione ovvia è il loop lungo l'elenco e confrontare l'obiettivo target con il referente di ogni riferimento (owner.equals(reference.get()) o owner == reference.get() se ciò che si sta verificando è che entrambe le variabili puntano allo stesso oggetto).