Tengo una aplicación de Android simple que usa una instancia de una clase, llamémoslo DataManager
, para administrar el acceso a las clases de dominio de forma similar a Façade. Inicialmente lo diseñé como un singleton que se podía recuperar usando métodos estáticos pero finalmente me irrité con el desorden de mi implementación y refactoré a lo que consideré una idea más simple y más limpia.¿Es posible, y cuál es la mejor estrategia, pasar objetos por referencia de una actividad a la siguiente?
Ahora la idea es que para cada archivo que se abre, se crea un DataManager
, que maneja tanto la E/S de archivos como la modificación de las clases de dominio (por ejemplo, Book
). Al iniciar una nueva actividad, paso esta instancia como Serializable
extra (todavía no llegué a usar Parcelable
, pero espero que lo haga cuando tenga el concepto básico en funcionamiento), y luego tomo el DataManager
del Intent
en el método onCreate()
de la nueva Actividad.
Sin embargo, la comparación de los objetos indica que el objeto enviado desde una actividad no es idéntico (referencias diferentes) al objeto recuperado del Bundle
en la segunda Actividad. Leer en Bundle
(en StackOverflow, etc.) sugiere que los paquetes no pueden hacer nada más que pasar por valor.
Entonces, ¿cuál es la estrategia más segura y más segura para pasar un objeto entre Actividades? Tal como lo veo yo podría
Olvídate de pasar por referencia y vivir con cada
Activity
tener su propio objeto DataManager. Devuelva el nuevoDataManager
cada vez que cierre una actividad para que la actividad subyacente pueda usarla. (La solución simple, creo).Vuelva a utilizar un singleton
DataManager
y utilice un método estático para obtenerlo de cadaActivity
. (No está interesado en usar singletons otra vez).Amplíe la aplicación para crear una especie de referencia global a
DataManager
. (De nuevo, no está interesado en la idea de los globales).
¿Es eso un sumario justo? ¿Hay alguna otra estrategia saludable que pueda usar?
Solo una palabra acerca de la terminología: Java * always * usa el valor por pasaporte, ya sea que esté pasando referencias o tipos primitivos. Los objetos nunca pasan. Creo que sé a qué te refieres, pero usar pass-by-reference es un poco una distracción. –
Preferiría usar el método Singleton, se usa clásicamente para clases de instancia única con un punto de acceso global. – Egor
Si debe usar un Singleton, puede usar una subclase de aplicación. En mi experiencia, es mejor evitar las clases DAO en Android y usar ContentProviders. Están inherentemente disponibles en todas partes. –