CREATE STATIC
CREATE STATIC
These keywords, when placed alone at the beginning of a class file,
tell the interpreter that when applying non-static symbols to
the name of the class, an automatic hidden instance of it will
be created on the fly.
If you use this feature, the class constructor (the special method _new
) will be called with no parameters.
This feature is already used internally by the
Form and the
Settings classes.
Here is an excerpt of the
Settings class code:
Example: Settings.class (gb.settings)
Export
Create Static
' ...
Public Sub _new(Optional Path As String, Optional Title As String)
' ...
If Not Path Then
Path = Settings.DefaultDir &/ Application.Name & ".conf"
Explanation
Consider this line of Gambas code:
Print Settings["Key"]
It looks like the array accessor method
_get() is applied to the Settings
class to get the value corresponding to the key "Key", but this doesn't make sense as the _get() method of Settings is not
static but dynamic, i.e. it does not belong to the class but to some object of the class. But since Settings is CREATE STATIC, the interpreter will create the automatic instance of the Settings class behind the scenes and use this object for the array access.
The automatic instance of Settings is, as explained above, constructed without arguments. In the Settings.class code snippet above you see that in this case
Path is set to the default configuration file path
Settings.DefaultDir &/ Application.Name & ".conf"
.
In conclusion, whenever you use the class name "Settings" like an object (by using dynamic symbols on it), you actually use the hidden automatic instance of the Settings class, which is linked to the default configuration file.
[ASIDE] "Singletons"
This feature, together with
CREATE PRIVATE, can be used to implement the object-oriented programming
singleton pattern. CREATE STATIC allows you to use a class name like an object while CREATE PRIVATE makes the class uninstantiable (except for the automatic instance).
Instead of a CREATE STATIC + CREATE PRIVATE class you can also effectively use a
module in Gambas!
See also