La forma correcta de instanciar e inicializar objetos en android

Tengo varios paquetes en mi proyecto de android que contiene un número de clases. Cuando quiero crear un objeto de una determinada clase en una actividad de interfaz de usuario, había utilizado un método de creación de un objeto privado e inicializarlo antes del método onCreate() donde las actividades de interfaz de usuario se encuentran en un paquete independiente.

 private SomeClass someClass = new SomeClass(); onCreate(Bundle savedInstanceState) { // Activity } 

He notado mis programadores mayores utilizan otro método tal que declaran el objeto antes de onCreate() y lo inicializan cuando el objeto es necesario. ¿Cuál es la diferencia y me sugieren la mejor manera? Quiero corregir si estoy haciendo algo mal aquí.

Normalmente prefiero el segundo enfoque porque el objeto se creará sólo cuando sea necesario. En el primer enfoque está creando un objeto singleton. El objeto toma memoria incluso antes cuando es necesario. Algunas situaciones que prefiero el segundo enfoque son:

  • Si el mismo objeto será utilizado de diferentes partes de la actividad. Por lo tanto, no desea comprobar la nula cada vez antes de usar quiere un código limpio y desea un código más limpio.
  • Si habrá un solo objeto común para la clase que no cambiará a través de. Por lo general, lo hacen estático. Un buen ejemplo es:
    String LOG_TAG = MyActivity.class.getSimpleName();
  • Si el objeto se utilizará con frecuencia en su actividad. Para la actividad que hace la comunicación frecuente con el servidor, por ejemplo, usted debe crear el objeto de la clase que hace la comunicación de esta manera. Otro ejemplo es

Si el objeto se utilizará en ciertas partes de la clase, debería considerar declararla dentro de esa clase.

Por alguna razón me gusta quedarme con el primer enfoque para las variables de nivel de clase. Esto me ahorra el problema de tratar con nullpointerexception si el objeto de la clase no ha sido inicializado. Quédate con el primero. Por ejemplo, vamos a tomar la clase String:

 String mystring; //in some functions deep inside code mystring = "hello world";//works great with string 

Pero vamos a tomar un ejemplo de búfer de cadena similar:

 StringBuffer mystring; //in some functions deep inside code mystring.append("hello world"); 

En el segundo ejemplo me olvidé mystring = new StringBuffer (); Por lo tanto, el .append dará la excepción nullpointer y el editor es generalmente clueless. Esto sucede mucho de lo que usted espera. Lo mismo ocurre con arrayList y otros.

A primera vista, diría que si declara la variable / objeto dentro de onCreate, sólo lo tendrá disponible en ese método. (Variables de ámbito local)

Creando la variable fuera e inicializando la variable / objeto dentro del primer método que se ejecuta (onCreate) tendrás una variable de toda la clase que puedes usar donde quiera que esté en la clase, ten cuidado de proteger el acceso a ella con if(var != null) para evitar NullPointeException. (Gloabal variables de alcance)

Yo personalmente no prefiero ninguno de los dos, sólo lo uso correctamente para cada caso, debido a que el segundo caso retiene la memoria por un tiempo más largo, y que es innecesario si se utiliza esa var en un ámbito local sólo

Por ejemplo, si necesita un MediaPlayer que se reproduce al inicio de una actividad y se detiene al salir, es mejor que lo declare globalmente, para inicializarlo en onCreate, hacer que funcione en onResume, hacer que se detenga en onStop y Lanzarlo en onDestroy, así que:

  • Sólo se inicializa el MediaPleyr una vez (onCreate)

  • Cada vez que vuelve a entrar en la actividad (onResume), MediaPlayer se inicia y no necesita ser inicializado

  • Al salir de la actividad, el MediaPlayer se detiene (onPause)

  • Cuando la actividad ya no necesita la memoria se libera, por lo que no "IllegalState" excepciones o fugas de objetos (onDestroy)

* Usted también podría hacer todo eso con un montón de oyentes (onPreparedListener, onCompletionListener, …), pero esto es sólo otra manera, y tienen un comportamiento ligeramente diferente

  • Después de cambiar la orientación de la pantalla, el diálogo aparece aparentemente sin ninguna llamada
  • Actividad OnCreate no activada
  • Super.onCreate (savedInstanceState);
  • Ciclo de vida de la actividad de Android: ¿para qué sirven todos estos métodos?
  • Sqlite onCreate () problema Quiero que mi base de datos creada una vez, y no va a cambiar, pero no puedo crear datos cuando estoy en onCreate ()
  • OnCreate () llamado mientras se detiene la actividad (pero no se destruye). Sólo después de la instalación
  • Diferencia entre getExtras (nombre) .getString y getIntent (). GetStringExtra (nombre)
  • Establecer el texto de la hiladora antes de seleccionar el elemento
  • Android SDK equivlent para viewWillAppear (iOS)?
  • ¿Cómo detectar los cambios de orientación pero dejar que el android los maneje?
  • Fragmento en ViewPager devuelve objeto vacío onResume
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.