Ho una semplice applicazione Android che utilizza un'istanza di una classe, chiamiamola DataManager
, per gestire l'accesso alle classi di dominio in modo simile a Façade. Inizialmente l'ho progettato come un singleton che poteva essere recuperato usando metodi statici, ma alla fine mi sono irritato con la confusione della mia implementazione e rifatto a ciò che pensavo fosse un'idea più semplice e pulita.È possibile, e qual è la strategia migliore, passare oggetti per riferimento da un'attività alla successiva?
Ora l'idea è che per ogni file che viene aperto, viene creato uno DataManager
, che gestiscono l'I/O del file e la modifica delle classi di dominio (ad esempio Book
). Quando avvii una nuova attività, passo questa istanza come Serializable
in più (non ho ancora iniziato a usare Parcelable
ancora, ma mi aspetto che lo farò quando avrò il concetto di base funzionante), e poi prendo lo Intent
in il metodo onCreate()
della nuova attività.
Tuttavia, il confronto degli oggetti indica che l'oggetto inviato da un'attività non è identico (riferimenti diversi) all'oggetto recuperato da Bundle
nella seconda attività. La lettura su Bundle
(su StackOverflow, ecc.) Suggerisce che i pacchetti non possono fare altro che il pass-by-value.
Quindi qual è la strategia più pulita e sicura per il passaggio di un oggetto tra le attività? Come la vedo io potevo
Dimenticate il passaggio per riferimento e vivere con ogni
Activity
con il proprio oggetto DataManager. Passa il nuovoDataManager
ogni volta che chiudo un'attività in modo che l'attività sottostante possa utilizzarla. (La soluzione semplice, penso.)Torna a utilizzare un singleton
DataManager
e utilizzare un metodo statico per ottenerlo da ogniActivity
. (Non appassionato di utilizzare nuovamente i singleton).Estendere l'applicazione per creare una sorta di riferimento globale a
DataManager
. (Ancora una volta, non appassionato all'idea di globals.)
È un buon riassunto? C'è qualche altra strategia salutare che potrei usare?
Solo una parola sulla terminologia: Java * sempre * utilizza il pass-by-value, indipendentemente dal fatto che si passino riferimenti o tipi primitivi. Gli oggetti non sono mai passati affatto. Penso di sapere cosa intendi, ma usare il pass-by-reference è un po 'una distrazione. –
Preferirei utilizzare il metodo Singleton, è classicamente utilizzato per le classi a istanza singola con un punto di accesso globale. – Egor
Se è necessario utilizzare un Singleton, è possibile utilizzare una sottoclasse dell'applicazione. Nella mia esperienza, è meglio evitare le lezioni DAO su Android e utilizzare ContentProviders. Sono intrinsecamente disponibili ovunque. –