Yes, you heard me right! It is possible to utilize the pointers and references (at least in terms of behavior) in B4X Java-based languages (B4A and B4J).
There is a lot to explain about pointers and references but if you allow me to summarize and simplify, I'll do it in the following way:
Imagine you went to your favorite a hotel and you asked for a room.
Since the room itself is a huge heavy object, it's completely unthinkable that you would be given "the room" itself.
What you get instead is a key to that room!
A pointer is just like the room key. You may copy it, destroy it or even modify it (so that it opens another room).
A reference is like the room number. If you trash room 303, then you effectively trash room number 3 on the third floor of your favorite hotel (and the manager won't be happy!).
Alright, now that you get the point, how can we use it in B4X(A/J)?
Simple! Converting things to Object works just like a pointer, while copying non-primitive object types works as a reference.
Which one to use, it's up to you and what your code demands.
Self-explanatory example:
Happy coding!!
There is a lot to explain about pointers and references but if you allow me to summarize and simplify, I'll do it in the following way:
Imagine you went to your favorite a hotel and you asked for a room.
Since the room itself is a huge heavy object, it's completely unthinkable that you would be given "the room" itself.
What you get instead is a key to that room!
A pointer is just like the room key. You may copy it, destroy it or even modify it (so that it opens another room).
A reference is like the room number. If you trash room 303, then you effectively trash room number 3 on the third floor of your favorite hotel (and the manager won't be happy!).
Alright, now that you get the point, how can we use it in B4X(A/J)?
Simple!
Which one to use, it's up to you and what your code demands.
Self-explanatory example:
B4X:
Dim myOriginalMap As Map
Dim myOriginalList As List
'References
'----------------------------------------------------------
myOriginalList.Initialize
myOriginalList.Add("A")
myOriginalList.Add("B")
myOriginalList.Add("C")
myOriginalMap.Initialize
myOriginalMap.Put("list", myOriginalList)
For Each value As String In myOriginalList
Log(value)
Next 'No surprises here...
Log("---")
Dim myMapReference = myOriginalMap As Map
Dim myListReference = myMapReference.Get("list") As List
myListReference.RemoveAt(1) 'Removes "B" from the list
For Each value As String In myOriginalList
Log(value)
Next 'The original list was modified!!!
Log("---")
myListReference.Clear
For Each value As String In myOriginalList
Log(value)
Next 'Will this work???
If myOriginalList.Size == 0 Then Log("Oops!! We have just destroyed the original list!")
Log("===================================")
'Pointers
'----------------------------------------------------------
myOriginalList.Initialize
myOriginalList.Add("A")
myOriginalList.Add("B")
myOriginalList.Add("C")
myOriginalMap.Initialize
myOriginalMap.Put("list", myOriginalList)
Dim myMapReference = myOriginalMap As Map
Dim myListPointer = myOriginalList As Object 'Creates the pointer.
Dim myListReference = myListPointer As List 'Dereferences the pointer back into a list
For Each value As String In myListReference
Log(value)
Next 'So far so good...
Log("---")
'Let's destroy the pointer!
myListPointer = Null 'Destroying the pointer affects neither the reference nor the original :)
Log("myListPointer is Null (should be true): " & (myListPointer == Null))
Log("myListReference.Size (should be 3): " & myListReference.Size)
For Each value As String In myOriginalList
Log(value)
Next 'The original list was kept intact.
Log("---")
'Remember that destroying a reference is the same as destroying the original!
myListReference.Clear
Log("myOriginalList.Size (should be zero): " & myOriginalList.Size)
For Each value As String In myOriginalList
Log(value)
Next 'The original was modified because we're dealing with a direct reference.
Happy coding!!
Last edited: