Se trata de bloquear el constructor sin argumentos convirtiéndolo en private.
En muchas ocasiones es imprescindible, sobre todo cuando deseamos exigir datos en la inicialización de la misma, y no deseamos que se inicie una copia de nuestra clase de forma accidental.
Public Class Clase
Public UnDato As Integer
' Constructor sin captura de datos
Private Sub New()
End Sub
' Constructor que obliga a introducir un dato en la inicialización
Public Sub New(ByVal AlgunDato As Integer)
UnDato = AlgunDato
End Sub
End Class
De esa forma no es visible y no se puede utilizar, y es imposible que se use accidentalmente.
Normalmente es muy habitual que necesitemos varios escenarios posibles en el inicio de un objeto, por lo que la solicitud de datos en el constructor se puede volver algo complicada.
En las clases existe el concepto de sobrecarga, esto significa poder escribir varias versiones de un mismo método, - más adelante se expondrá el tema - , ese es el camino más adecuado para poder solventar el problema de los distintos escenarios posibles en el inicio de una clase para los objetos que se derivan de ella.
En el siguiente ejemplo, podemos observar como se han escrito varias versiones del constructor en el cual se ha declarado distintas versiones de la misma variable, String, Integer, aunque no tiene porque cambiar el nombre de la variable.
Public Class Clase
Public UnDato As Integer
' Constructor sin captura de datos
Private Sub New()
End Sub
' Constructor que obliga a introducir un dato en la inicialización
Public Sub New(ByVal AlgunDato As Integer)
UnDato = AlgunDato
End Sub
' Constructor que obliga a introducir un dato en la inicialización
Public Sub New(ByVal AlgunDato As String)
End Sub
End Class
Pero también se puede crear con distintas variables en cada uno de ellos.
Public Class Clase
Public UnDato As Integer
' Constructor sin captura de datos
Private Sub New()
End Sub
' Constructor que obliga a introducir un dato en la inicialización
Public Sub New(ByVal AlgunDato As Integer)
UnDato = AlgunDato
End Sub
' Constructor que obliga a introducir un dato en la inicialización
Public Sub New(ByVal AlgunDato As Integer, ByVal OtroDato as Integer)
End Sub
End Class
Podemos observar como en este ejemplo se mantiene el nombre de la variable, pero se añade una nueva en la segunda versión del mismo.
La clase no se ejecuta, se ejecuta una instancia de la misma, en el objeto que de ella se crea.
El punto de inicio es el constructor de la misma.
' Constructor que obliga a introducir un dato en la inicialización
Public Sub New(ByVal AlgunDato As Integer)
End Sub
La ejecución del objeto, se iniciará en una fase inicial cuando se declara y se inicializa el mismo, y en segundas fases cuando se reclama la ejecución de cualquiera de sus métodos.
La finalización de la ejecución de cualquiera de sus métodos no implica que deje de ser utilizado el objeto y que éste deje de consumir recursos.
La ejecución permanecerá activa hasta que se ejecute una asignación de “nothing” o “null”, al objeto que de ella se deriva, o bien hasta que desaparezca el mismo de la memoria por finalizar el procedimiento o programa que lo reclama, o bien finalicemos la misma con el método de finalización previsto en el lenguaje.
Tengamos presente que mientras no se ejecute una de estas acciones, el objeto estará consumiendo recursos del sistema.
Finalize está protegido y, por lo tanto, sólo se puede obtener acceso a él a través de esta clase o de una clase derivada.
Este método se invoca de forma automática, después de que un objeto pase a ser inaccesible, salvo que haya sido excluido del proceso de finalización mediante una llamada a SuppressFinalize. Durante el cierre de un dominio de aplicación, se realiza una llamada automática a Finalize para los objetos que no están exentos de finalización, incluso para aquellos objetos que a los que aún se puede obtener acceso. Sólo se realiza una llamada a Finalize para una instancia especificada, a menos que el objeto vuelva a registrarse mediante un mecanismo como ReRegisterForFinalize y no se haya llamado posteriormente a GC.SuppressFinalize.
Todas las implementaciones de Finalize en un tipo derivado deben llamar a la correspondiente implementación de tipo base de Finalize. Este es el único caso en el que se permite al código de la aplicación llamar a Finalize.
La regla de oro a seguir es que no se debe poner ningún código que deba ser ejecutado en el método finalize().
Por ejemplo, si se necesita concluir la comunicación con un servidor cuando ya no se va a usar un objeto, no debe ponerse el código de desconexión en el método finalize, porque puede que nunca sea llamado.
Es responsabilidad del programador escribir métodos para realizar la limpieza que no involucre a la memoria ocupada por el objeto y ejecutarlos en el instante preciso.
Objeto = nothing
El método finalize y el recolector de memoria son útiles para liberar la memoria de la pila y debería restringirse su uso solamente a eso, y no depender de ellos para realizar ningún otro tipo de limpieza.
En la construcción de un objeto, se desplaza uno por el árbol de jerarquía, de herencia, desde la raíz del árbol hacia las ramas, y en la finalización, es al revés, los desplazamientos por la herencia debe ser desde las ramas hacia las superclases hasta llegar a la clase raíz.
![]() |
Síguenos en: Facebook Sobre aulaClic Política de Cookies