Jarrett Billingsley:
> Jeremie Pelletier:
> >
> > How would you do this then?
> >
> > void foo(int a) {
> > Object foo;
> > if(a == 1) foo = new Object1;
> > else if(a == 2) foo = Object2;
> > else foo = Object3;
> > foo.doSomething();
> > }
> >
> > The compiler would just die on the first line of the method where foo is
> > null.
>
> Either use Object? (a nullable reference), or factor out the object
> creation - use a separate method or something.
Using a separate function to initialize an nonnull reference is a possible
solution, but we can invent nicer solutions too.
You can have a function where inside an object is nullable but returns a
nonnull reference, see the enforce() used by Denis Koroskin. (The compiler also
has to recognize as a possible "enforce" an if (foo is null) {...}).
Another possible solution is to use something like a Python "with" block that
assures something is done when the block is done:
enforce (Object foo) {
// foo is nonnull, but inside here it's in a limbo
if(a == 1)
foo = new Object1;
else if(a == 2)
foo = Object2;
else
foo = Object3;
} // when the enforce block ends foo must be initialized
foo.doSomething();
Probably there are other possible solutions.
A better solution is to just allow foo to be undefined until it's written over.
To simplify analysis it has to be defined when the scope ends.
Bye,
bearophile