Coding for the web on the ipad has not been working well for me over these past few nights. So tonight, I switch gears and explore me some Dart internals. Specifically, I am going to play with factory constructors.
By declaring an otherwise normal constructor as a factory, we are telling Dart that it need not create instances of the Class under construction. Rather, we will handle it ourselves.
My limited brain has fixated on the most obvious use-case in the world: a singleton. In a sign of just how sleep deprived I am, I will create a class named
Foo
with a property of bar
. If I create two instances of the singleton Foo, then both should have the same value for bar
.In other words, both of the following statements should have the same value for
bar
:main() { final foo1 = new Foo("bar1") , foo2 = new Foo("bar2"); print("foo1 is: ${foo1.bar}"); print("foo2 is: ${foo2.bar}"); }If I implement the Foo class correctly, then the output should be:
foo1 is: bar2 foo2 is: bar2So let's take a look at the factory constructor for this beast:
class Foo { var bar; static Foo instance; factory Foo(name) { if (instance == null) { instance = new Foo._internal(name); } return instance; } Foo._internal(this.bar); }Starting from the bottom, the
Foo._internal(this.bar)
line is a constructor. The underscore in the name is a convention for a private constructor. By using this.bar
as the argument in the constructor, I am saying that any arguments supplied should be used to set the this.bar
property.That is, the following:
var internal = new Foo._internal("internal"); print("internal is: ${internal.bar}");Should produce:
internal is: internalMoving up in the class, the factory is defined as:
factory Foo(name) {
if (instance == null) {
instance = new Foo._internal(name);
}
return instance;
}
Just as with my internal construtor, I accept a single argument which will be used to set the bar
property. If the static/class property instance
is null, then I create it fresh from the internal constructor. If instance has already been set (e.g. a previous object has already defined this static/class variable, then I do nothing. In either case, I return the instance. It is this return value, not internal Dart magic which creates the object instance for factories.When I run the following:
main() { final bar1 = new Foo("bar1") , bar2 = new Foo("bar2"); print("bar1 is: ${bar1.bar}"); print("bar2 is: ${bar2.bar}"); }I get the following output:
bar1 is: bar1 bar2 is: bar1So indeed, I do have my Singleton factory working as desired. Nice.
Day #276
No comments:
Post a Comment