2011-02-14 3 views
16

En muchos de los métodos de Android, especialmente los constructores y los métodos reemplazados, debe o incluso debe llamar al método de clase principal utilizando super(). Cuando se utiliza el eclipse Fuente> Sustituir/implementar métodos ... tienen el código de una plantilla con las etiquetas TODO así:Ubicaciones de llamadas super() en Android Eclipse Plugin código generado confiable?

public MyCanvas(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // TODO Auto-generated constructor stub 
} 


@Override 
protected void onDraw(Canvas canvas) { 
    // TODO Auto-generated method stub  
    super.onDraw(canvas); 
} 

No entiendo exacly lo que hace la superclase en cada caso, por lo que siempre inserte mi código en la ubicación exacta de las etiquetas // TODO. En el ejemplo, llamaría a super() antes de mi código en el constructor y después de mi código en onDraw().

¿Puedo confiar siempre en estas ubicaciones de inserción de código en el código generado? ¿Hay una regla/explicación simple cuándo llamar a super()?

+0

Aunque creo que la pregunta es respondió - gracias -, no me gusta el resultado. Al pensar en el diseño de API y la separación de responsabilidades, creo que un programador de aplicaciones no debería tener que buscar en el código fuente de una API para descubrir qué está pasando. Me gustaría saber si y cuándo llamar a super() mirando la documentación de API. Tal vez se debería hacer un esfuerzo para documentar exactamente qué hacen cada uno de estos métodos en la clase API. Por ejemplo, si View.onDraw() no hace nada, preferiría dejarlo fuera por motivos de rendimiento, pero no estoy seguro si exploto algo así. –

+1

Con la documentación adecuada, nunca debería tener que mirar el código fuente para determinar si (o cuándo) llamar a super(). Desafortunadamente, muchos de los métodos en la API de Android están mal documentados (o no están documentados en absoluto). Y además, la mayoría de nosotros aprendimos hace mucho tiempo: la única buena documentación es el código en sí. Al menos el código está disponible para Android (a diferencia de algunas otras API que no mencionaré). –

+0

La Superclase debe invocarse FIRST en 'onRestoreInstanceState, onStop, onRestart, onStart', la Superclase debe invocarse al LAST en' onDestroy, onPause, onSaveInstanceState, onResume' –

Respuesta

14

Esta es una buena pregunta. Desafortunadamente, no hay una regla simple para esto. Necesita saber qué hace la implementación de la superclase. A veces (como en View.onDraw()), la implementación de la superclase no hace nada; llamar a super() es inofensivo e innecesario. En otros casos (como Activity.onCreate()), la implementación de la superclase realiza operaciones críticas que se deben ejecutar en algún punto del procesamiento de la subclase. A veces, lo que sucede cuando llamas a super() debe aparecer antes de cualquier procesamiento en la subclase, a veces en otros puntos. Algunas veces quiere reemplazar completamente el procesamiento de la superclase con el suyo, en cuyo caso no llama a super() en absoluto. Tiene completa libertad para llamar a la versión de la superclase en cualquier punto (o incluso en múltiples puntos) en la lógica de su subclase.

En constructores, la llamada a un constructor de superclase (si está presente) debe ser lo primero en el método. Si no tiene uno, el compilador inserta automáticamente una llamada al constructor sin argumentos en la superclase. (Si la superclase no tiene un constructor sin argumentos, o si no es accesible para la subclase, el compilador genera un error.)

Si la documentación no proporciona suficiente información, entonces debe observar el código fuente El código de Android está disponible here (Versión de pan de jengibre). El código de API está bajo core.

EDIT El código ya no está disponible en git.kernel.org. Aquí hay otros dos lugares donde se puede navegar el código:

El código principal se encuentra en la Plataforma de repositorio> Marcos> Base

0
3

¿Puedo confiar siempre en estos lugares inserciones de código en el código generado?

No, a veces no quieren llamar a la super.method. A veces quieres llamarlo primero, a veces en el último lugar, etc. Depende. Pero, estoy hablando de métodos, no constructores.

¿Hay una regla/explicación simple cuándo llamar a super()?

Siempre tendrá a todos los puntos super como respuesta anterior. El único caso donde no se llama super es cuando el constructor de la superclase no tiene parámetros; en ese caso, el compilador pondrá el super por usted.

No entiendo lo exacly la superclase no en cada caso, así que siempre insertar mi código en el lugar exacto de las etiquetas // TODO

Si usted está en duda (Estoy hablando de súper métodos), siempre puedes echarle un vistazo al código fuente. Google Code Search es un buen recurso para hacerlo. Luego puede decidir si coloca su código antes o después del método súper; o incluso, no pongas el supermétodo en absoluto.

Tenga en cuenta que no poner el supermétodo es válido en tiempo de compilación. Sin embargo, algunos métodos en Android no funcionarán a menos que invoque el método super (por ejemplo, el método onResume de la clase Activity).

Además, algunas veces usted decidirá si ejecuta el método super o no en tiempo de ejecución.Considere este ejemplo clásico:

@Override 
public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if(KeyEvent.KEYCODE_BACK == event.getKeyCode()){ 
     return true; 
    } 
    return super.onKeyUp(keyCode, event); 
} 

Si el usuario presiona la tecla Atrás, no llamará al método super. Si el usuario no lo hizo, delegue el trabajo al supermétodo.