2010-04-26 3 views
6

Esta es una pregunta sobre el estilo de codificación y prácticas recomendadas:¿Pones una llamada super() como el comienzo de tus constructores?

Como se explica en las respuestas a la pregunta unnecessary to put super() in constructor?, si se escribe un constructor para una clase que se supone que debe utilizar el valor por defecto (sin argumentos) constructor de la superclase, puede llamar super() al comienzo de su constructor:

public MyClass(int parm){ 
    super(); // leaving this out makes no difference 
    // do stuff... 
} 

pero también se puede omitir la llamada; el compilador actuará en ambos casos como si la llamada super() estuviera allí.

Entonces, ¿pones la llamada en tus constructores o no?

Por un lado, se podría argumentar que incluir el super() hace las cosas más explícitas. OTOH, siempre me disgusta escribir código redundante, así que personalmente tiendo a dejarlo fuera; Sin embargo, lo veo regularmente en código de otros.

¿Cuáles son sus experiencias? ¿Tuviste problemas con uno u otro enfoque? ¿Tiene pautas de codificación que prescriben un enfoque?

BTW: Una pregunta relacionada (sólo para referencia):

Is there a reason to explicitly code a default constructor when there are no other constructors?

+0

No, pero posiblemente porque casi todo el código que leí (¡y aprendí!) No. Podría simplemente estar perpetuando el mal estilo que aprendí. –

Respuesta

20

no escribo la llamada super() por la misma razón que no escribo moldes innecesarios:

Se añade ruido al código sin proporcionar ninguna información adicional (ni al compilador ni al desarrollador que lee mi código).

+3

+1 para "evitar el ruido". El código ya es suficientemente difícil de leer ... – sleske

4

Los ajustes predeterminados de algunas versiones de algunos IDE generan de forma automática, por lo que es una de las razones que podría estar viendo la misma.

Si escribirlo o no depende de quién lo va a leer. Prefiero no agregarlo, pero si no está seguro de que los miembros del equipo comprendan lo que hace el compilador y cómo procede la construcción del objeto, puede agregarlo "por si acaso".

+7

Si no está seguro de que los miembros del equipo comprendan lo que hace el compilador, entonces tiene problemas más graves ... – sleske

+1

true :) (15chrs) – Bozho

4

No, pero el argumento que se me dio para hacer esto mientras estaba en la universidad fue que hace las cosas más explícitas, para que no 'olvide' que se está llamando a un constructor de superclase.

Simplemente no veo la necesidad aunque.

2

¿Cuáles son sus experiencias? ¿Tiene tiene problemas con uno u otro enfoque ?

nunca llama el constructor por defecto (explícito) y nunca se enfrenta cualquier problema

+0

-1 Probablemente lo hizo ... implícitamente – Tomas

+0

@Tomas - sí, por supuesto, corregido es feliz ahora? – stacker

1

Nunca lo agregué y quedé profundamente conmocionado cuando un colega no entendió que había una llamada implícita hecha a la súper clase, así que tal vez debería empezar a hacerlo.

+8

O tal vez deberías empezar a educar a tu colega ;-) –

0

De hecho, puse la llamada super() ya que considero que es un ayudante de memoria útil. Cuando escribí un fragmento de código hace unos meses y volví a él, el super() me recuerda cuando estoy mirando al constructor que la clase que escribí hereda de algo.

+4

¿No es suficiente decir que "se extiende" al principio de la clase ;-)? – sleske

+0

Sería si el constructor y la definición de clase fueran visibles al mismo tiempo, lo que no siempre es el caso. Generalmente pongo todos mis atributos antes de mis métodos. –

1

Uso el super() solo cuando el constructor super() necesita parámetros.

+3

Por supuesto, pero esa es una situación totalmente diferente: si necesita pasar parámetros, * debe * llamar explícitamente a super (parms), por lo que ya no se trata de un estilo de codificación ... – sleske

1

Ventaja: Cualquiera que lea su código sabe que realmente desea llamar al constructor predeterminado, no dejó la llamada por error.

Desventaja: Abarrotar el código con información sin importancia.

Por lo general, si un idioma le permite omitir algunas instrucciones, no es un mal estilo hacerlo. Creo que se trata de sopesar los pros y los contras. Por ejemplo, escribir explícitamente super() cuando su constructor tiene parámetros y la clase base también tiene constructores con parámetros disponibles puede ser una buena idea.

0

Intento evitar escribir código donde llamar a super() es necesario, porque prefiero la composición a la herencia.

Si tengo que derivar de otra clase, intento poner ambas detrás de una interfaz propia y pasar una de ellas a la otra como una dependencia.

Si tengo una clase lib, sin embargo, que no puedo darle una dependencia adicional, lo primero que intento es usar un decorador.

Si esto no funciona, y tengo que derivar de una implementación, creo que no importa si escribir o no super(), ya que son tan poco frecuentes;)

Así que, en todo Creo que esta pregunta no tiene sentido

Cuestiones relacionadas