Metodo estatico/constructor

12/03/2006 - 00:11 por Jose Fernandez | Informe spam
Hola.
Tengo una tonta duda.

Yo tengo una clase ( XXX ) que tiene el constructor por defecto XXX() y un
metodo estatico GetXXX() que devuelve un dato tipo XXX (tipo la misma
clase).
Mi pregunta es que cuando yo invoco ese metodo
miObjeto = XXX.GetXXX()
quisiera saber si primero se me ejecuta el constructor y despues el metodo o
si el constructor es ignorado. Por lo que se, SIEMPRE se ejecuta el
constructor de cada clase, asi no lo tengamos declarado (como en Java que
por defecto si no pones constructor y no tienes miembros sin valor, el
"ejecuta" el constructor por defecto que es nombreClase() )

Saludos

Preguntas similare

Leer las respuestas

#1 Eduardo A. Morcillo [MS MVP VB]
12/03/2006 - 02:31 | Informe spam
Si es constructor no es estatico, no se ejecuta porque no estas creando una
instancia de la clase al llamar a GetXXX por ser este estatico. Esta claro
que hablamos de la llamada a GetXXX y no a la construccion del objeto que se
hace en ese metodo (ahi si se ejecuta el constructor). Si el constructor es
estatico entoces se ejecutara una sola vez la primera vez que utilices la
clase, sea cn un metodo estatico o creando una instancia. Otra cosa para
aclarar es que el constructor por defecto definido en la clase no siempre se
ejecuta en el caso que tengas mas de un constructor a menos que desde de los
otros constructores llames explicitamente al que definiste (sino el que se
ejecuta es el de la clase base).

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
http://mvp.support.microsoft.com/pr...4EF5A4191C
Respuesta Responder a este mensaje
#2 Octavio Hernandez
12/03/2006 - 11:48 | Informe spam
Pepe,

Me parece que tu pregunta tiene que ver con que estás implementando o has
visto implementado algún patrón con "método fábrica" (factory method), donde
se obliga al cliente a construir los objetos de la clase a través de un
método en vez de llamar al constructor directamente. "Singleton" (instancia
única) es un ejemplo típico de ese tipo de patrones.

a) Primero las aclaraciones generales, que ya Eduardo ha respondido
perfectamente:

Por lo que se, SIEMPRE se ejecuta el constructor de cada clase...



La frase exacta sería "siempre QUE SE CREA una instancia de una clase, se
ejecuta ALGUNO de sus constructores" Y siempre existe al menos un
constructor, porque si no se ha declarado ninguno al compilar la clase se le
añade el constructor por defecto (como en Java).

Ahora bien, es posible que por razones de visibilidad (los constructores son
privados) no se pueda crear objetos de la clase. Esto es lo que hacen
frecuentemente los creadores de clases que definen "métodos fábrica" del
tipo GetXXX().

Mi pregunta es que cuando yo invoco ese metodo
quisiera saber si primero se me ejecuta el constructor y despues el
metodo...



En principio *NO* se ejecuta ningún constructor cuando se llama a un método,
sea estático o no. Si el método es estático, no necesita la existencia de
una instancia para operar, y si no es estático, la instancia la debes haber
creado tú explícitamente antes de hacer la llamada.

b) Ahora sobre tu pregunta original:

Yo tengo una clase ( XXX ) que tiene un metodo estatico GetXXX() que
devuelve un dato tipo XXX (tipo la misma clase). ¿Se ejecuta el
constructor?



Automáticamente, ya hemos visto que *NO*. En general, la respuesta depende
de LO QUE TENGA DENTRO ese método estático. Se supone que ese método
devuelve un objeto de la clase, y por ello es altamente probable que DENTRO
DEL CODIGO DEL METODO HAYA UN new XXX() que se encargue de construir el
objeto que se va a devolver. Fíjate que en ese caso no importaría que los
constructores fueran privados porque se trata de un método de la propia
clase.

Por ejemplo, mira esta implementación de un 'singleton'. Solo queremos que
exista un único objeto de la clase. Por eso hacemos el constructor privado
(si fuera público, no podríamos impedir que lo llamaran cuantas veces
quisieran), y programamos un método GetUnico() que construye en objeto SOLO
LA PRIMERA VEZ. Las siguientes veces que sea llamado, devolverá el mismo
objeto que creó anteriormente.

public class Unico
{
// el constructor es privado,así que nadie podrá usarlo
private Unico()
{
}
// la única instancia que existirá
// es privada, así que nadie podrá usarla directamente
private static Unico instancia = null;
// el método que habrá que utilizar para obtener la instancia
public static GetUnico()
{
// sólo la primera vez construimos la instancia
if (instancia == null)
instancia = new Unico();
// la devolvemos
return instancia;
}
}

Espero que ayude.

Salu2 - Octavio


si el constructor es ignorado. Por lo que se, SIEMPRE se ejecuta el
constructor de cada clase, asi no lo tengamos declarado (como en Java que
por defecto si no pones constructor y no tienes miembros sin valor, el
"ejecuta" el constructor por defecto que es nombreClase() )

Saludos

Respuesta Responder a este mensaje
#3 Jose Fernandez
13/03/2006 - 20:58 | Informe spam
HOla
Ante todo, muchas gracias. Acabo de entender la cosa. Es asi mismo. La clase
se crea en el metodo. retorna un tipo de datos de la misma clase despues de
crearla. Igual ya entendi bien lo del constructor.

Muchisimas gracias.


"Octavio Hernandez" wrote in message
news:
Pepe,

Me parece que tu pregunta tiene que ver con que estás implementando o has
visto implementado algún patrón con "método fábrica" (factory method),
donde se obliga al cliente a construir los objetos de la clase a través de
un método en vez de llamar al constructor directamente. "Singleton"
(instancia única) es un ejemplo típico de ese tipo de patrones.

a) Primero las aclaraciones generales, que ya Eduardo ha respondido
perfectamente:

Por lo que se, SIEMPRE se ejecuta el constructor de cada clase...



La frase exacta sería "siempre QUE SE CREA una instancia de una clase, se
ejecuta ALGUNO de sus constructores" Y siempre existe al menos un
constructor, porque si no se ha declarado ninguno al compilar la clase se
le añade el constructor por defecto (como en Java).

Ahora bien, es posible que por razones de visibilidad (los constructores
son privados) no se pueda crear objetos de la clase. Esto es lo que hacen
frecuentemente los creadores de clases que definen "métodos fábrica" del
tipo GetXXX().

Mi pregunta es que cuando yo invoco ese metodo
quisiera saber si primero se me ejecuta el constructor y despues el
metodo...



En principio *NO* se ejecuta ningún constructor cuando se llama a un
método, sea estático o no. Si el método es estático, no necesita la
existencia de una instancia para operar, y si no es estático, la instancia
la debes haber creado tú explícitamente antes de hacer la llamada.

b) Ahora sobre tu pregunta original:

Yo tengo una clase ( XXX ) que tiene un metodo estatico GetXXX() que
devuelve un dato tipo XXX (tipo la misma clase). ¿Se ejecuta el
constructor?



Automáticamente, ya hemos visto que *NO*. En general, la respuesta depende
de LO QUE TENGA DENTRO ese método estático. Se supone que ese método
devuelve un objeto de la clase, y por ello es altamente probable que
DENTRO DEL CODIGO DEL METODO HAYA UN new XXX() que se encargue de
construir el objeto que se va a devolver. Fíjate que en ese caso no
importaría que los constructores fueran privados porque se trata de un
método de la propia clase.

Por ejemplo, mira esta implementación de un 'singleton'. Solo queremos que
exista un único objeto de la clase. Por eso hacemos el constructor privado
(si fuera público, no podríamos impedir que lo llamaran cuantas veces
quisieran), y programamos un método GetUnico() que construye en objeto
SOLO LA PRIMERA VEZ. Las siguientes veces que sea llamado, devolverá el
mismo objeto que creó anteriormente.

public class Unico
{
// el constructor es privado,así que nadie podrá usarlo
private Unico()
{
}
// la única instancia que existirá
// es privada, así que nadie podrá usarla directamente
private static Unico instancia = null;
// el método que habrá que utilizar para obtener la instancia
public static GetUnico()
{
// sólo la primera vez construimos la instancia
if (instancia == null)
instancia = new Unico();
// la devolvemos
return instancia;
}
}

Espero que ayude.

Salu2 - Octavio


si el constructor es ignorado. Por lo que se, SIEMPRE se ejecuta el
constructor de cada clase, asi no lo tengamos declarado (como en Java que
por defecto si no pones constructor y no tienes miembros sin valor, el
"ejecuta" el constructor por defecto que es nombreClase() )

Saludos





email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida