Proyecto completo: http://nextmedici.com/projectos/pruebaStatic.tar.gz
Primero cree un proyecto consola con los siguientes códigos:
singleton.class
' gambas class file
'Archivo Singleton
Create Static
Property Read direccion As String
Property cadena As String
Static Private $cadena As String
Property cadena2 As String
Static Private $cadena2 As String
Property cadena3 As String
Static Private $cadena3 As String
Private Function direccion_Read() As String
Return "Direccion de Memoria: " & Object.Address(Me) & " SizeOf : " & Object.SizeOf(Me)
End
Private Function cadena_Read() As String
Return $cadena
End
Private Sub cadena_Write(Value As String)
$cadena = value
End
Private Function cadena2_Read() As String
Return $cadena2
End
Private Sub cadena2_Write(Value As String)
$cadena2 = value
End
Private Function cadena3_Read() As String
Return $cadena3
End
Private Sub cadena3_Write(Value As String)
'Archivo Singleton
Create Static
Property Read direccion As String
Property cadena As String
Static Private $cadena As String
Property cadena2 As String
Static Private $cadena2 As String
Property cadena3 As String
Static Private $cadena3 As String
Private Function direccion_Read() As String
Return "Direccion de Memoria: " & Object.Address(Me) & " SizeOf : " & Object.SizeOf(Me)
End
Private Function cadena_Read() As String
Return $cadena
End
Private Sub cadena_Write(Value As String)
$cadena = value
End
Private Function cadena2_Read() As String
Return $cadena2
End
Private Sub cadena2_Write(Value As String)
$cadena2 = value
End
Private Function cadena3_Read() As String
Return $cadena3
End
Private Sub cadena3_Write(Value As String)
Despues el archivo:
clase1.class
' gambas class file
Property Read propiedad1 As String
Property Read propiedad2 As String
Property Read propiedad3 As String
Private $singleton As New Singleton
Public Sub _main()
$singleton.cadena = "Valor en _main().clase1"
Print "En clase1: " & $singleton.direccion
End
Public Sub valor1()
$singleton.cadena2 = "Valor en valor1().clase1"
Print "En clase1: " & $singleton.direccion
End
Public Sub valor2()
$singleton.cadena3 = "Valor en valor2().clase1"
Print "En clase1: " & $singleton.direccion
End
Private Function propiedad1_Read() As String
Dim tmp As String
tmp = $singleton.cadena
Return tmp
End
Private Function propiedad2_Read() As String
Dim tmp As String
tmp = $singleton.cadena2
Return tmp
End
Private Function propiedad3_Read() As String
Dim tmp As String
tmp = $singleton.cadena3
Return tmp
End
Property Read propiedad1 As String
Property Read propiedad2 As String
Property Read propiedad3 As String
Private $singleton As New Singleton
Public Sub _main()
$singleton.cadena = "Valor en _main().clase1"
Print "En clase1: " & $singleton.direccion
End
Public Sub valor1()
$singleton.cadena2 = "Valor en valor1().clase1"
Print "En clase1: " & $singleton.direccion
End
Public Sub valor2()
$singleton.cadena3 = "Valor en valor2().clase1"
Print "En clase1: " & $singleton.direccion
End
Private Function propiedad1_Read() As String
Dim tmp As String
tmp = $singleton.cadena
Return tmp
End
Private Function propiedad2_Read() As String
Dim tmp As String
tmp = $singleton.cadena2
Return tmp
End
Private Function propiedad3_Read() As String
Dim tmp As String
tmp = $singleton.cadena3
Return tmp
End
El archivo:
clase2.class
MMain.module
Cuando ejecute esto me sorprendió un poco el resultado:
En clase1: Direccion de Memoria: 89F4824 SizeOf : 0
En clase1: Direccion de Memoria: 89F4824 SizeOf : 0
Valor en valor1().clase1
Valor en valor2().clase1
En clase2: Direccion de Memoria: 89F40BC SizeOf : 0
Valor en valor1().clase1
O sea que:
En clase1: Direccion de Memoria: 89F4824 SizeOf : 0 <-- Inicializa en esa dirección de memoria.
En clase1: Direccion de Memoria: 89F4824 SizeOf : 0 <--- Continua con el objeto ubicado en esa dirección.
<--- Aqui deberia estar en valor pasado en _main() de la clase uno, pero no es asi, primera sorpresa para mi
Valor en valor1().clase1 <--- OK
Valor en valor2().clase1 <--- OK
En clase2: Direccion de Memoria: 89F40BC SizeOf : 0 <--- Inicializa en otra direccion de memoria, porque hice NEW...
Valor en valor1().clase1 <--- Pero trae correctamente el valor.
Pero bien, seguí experimentando con cosas que ni siquiera coloco acá porque no tienen sentido, utilizando el método estático _init() para atajar el instanciamiento del objeto, pero se me ocurrió hacer algunos cambios en la forma de instanciarlos... entonces modifique lo siguiente:
Cuando los declare globalmente en la clase no los instancie con NEW. Entonces cada vez que lo utilizo usaba la palabra clave NEW y cuando terminaba de usarlo $objSingleton = Null. y el resultado fue así:
En clase1: Direccion de Memoria: 850492C SizeOf : 0
En clase1: Direccion de Memoria: 850492C SizeOf : 0
Valor en valor1().clase1
Valor en valor2().clase1
En clase2: Direccion de Memoria: 850492C SizeOf : 0
Valor en valor1().clase1
Las tres veces se instancio en la misma dirección de memoria!!!!!!...
Todo el codigo de clase1.class y clase2.class:
clase1.class
' gambas class file
Property Read propiedad1 As String
Property Read propiedad2 As String
Property Read propiedad3 As String
Private $singleton As Singleton
Public Sub _main()
$singleton = New Singleton
$singleton.cadena = "Valor en _main().clase1"
Print "En clase1: " & $singleton.direccion
$singleton = Null
End
Public Sub valor1()
$singleton = New Singleton
$singleton.cadena2 = "Valor en valor1().clase1"
Print "En clase1: " & $singleton.direccion
$singleton = Null
End
Public Sub valor2()
$singleton = New Singleton
$singleton.cadena3 = "Valor en valor2().clase1"
Print "En clase1: " & $singleton.direccion
$singleton = Null
End
Private Function propiedad1_Read() As String
Dim tmp As String
$singleton = New Singleton
tmp = $singleton.cadena
$singleton = Null
Return tmp
End
Private Function propiedad2_Read() As String
Dim tmp As String
$singleton = New Singleton
tmp = $singleton.cadena2
$singleton = Null
Return tmp
End
Private Function propiedad3_Read() As String
Dim tmp As String
$singleton = New Singleton
tmp = $singleton.cadena3
$singleton = Null
Return tmp
End
Property Read propiedad1 As String
Property Read propiedad2 As String
Property Read propiedad3 As String
Private $singleton As Singleton
Public Sub _main()
$singleton = New Singleton
$singleton.cadena = "Valor en _main().clase1"
Print "En clase1: " & $singleton.direccion
$singleton = Null
End
Public Sub valor1()
$singleton = New Singleton
$singleton.cadena2 = "Valor en valor1().clase1"
Print "En clase1: " & $singleton.direccion
$singleton = Null
End
Public Sub valor2()
$singleton = New Singleton
$singleton.cadena3 = "Valor en valor2().clase1"
Print "En clase1: " & $singleton.direccion
$singleton = Null
End
Private Function propiedad1_Read() As String
Dim tmp As String
$singleton = New Singleton
tmp = $singleton.cadena
$singleton = Null
Return tmp
End
Private Function propiedad2_Read() As String
Dim tmp As String
$singleton = New Singleton
tmp = $singleton.cadena2
$singleton = Null
Return tmp
End
Private Function propiedad3_Read() As String
Dim tmp As String
$singleton = New Singleton
tmp = $singleton.cadena3
$singleton = Null
Return tmp
End
clase2.class
Ahora otra cosa, pero que intuyo porque es si instancio la clase desde el MMain.module me genera otra dirección de memoria, pero puede ser que se separe las clase de los módulos, les muestro el cambio y que paso:
MMain.module
Resultado:
En clase1: Direccion de Memoria: 98748E4 SizeOf : 0
En clase1: Direccion de Memoria: 98748E4 SizeOf : 0
En clase2: Direccion de Memoria: 98748E4 SizeOf : 0
Valor en valor1().clase1
Valor en valor1().clase1
Valor en valor2().clase1
Direccion de Memoria: 9874154 SizeOf : 0
En clase1: Direccion de Memoria: 98748E4 SizeOf : 0
En clase2: Direccion de Memoria: 98748E4 SizeOf : 0
Valor en valor1().clase1
Valor en valor1().clase1
Valor en valor2().clase1
Direccion de Memoria: 9874154 SizeOf : 0
Alguien puede aclararme un poquito el panorama, darme algún consejo, o alguna lectura. Saludos.