Why does this() and super() have to be the first statement in a constructor?

Tom Ball tball at google.com
Mon Oct 10 09:36:56 PDT 2011


>
> This restriction is annoying at time, but no one has put forward a
> detailed proposal for how the requirement could be sensibility loosened
> in a way that can be standardized and tested.


Josh Bloch did in Effective Java: "prefer factory methods to constructors."
 You'd be amazed at what I get away with in my factory methods. :-)

Tom

On Sat, Oct 8, 2011 at 7:42 PM, Joe Darcy <joe.darcy at oracle.com> wrote:

> Ulf Zibis wrote:
> > Anyway,
> >      int c = a + b;
> > doesn't affect any object field initialization.
> > It's just a local variable, which gets lost after the instance is
> instantiated.
> >
> > As workaround, you can always use a static helper method which does the
> same:
> >      super(staticHelper(a, b));
> >
> > So I agree, it would reasonable, to allow some code in advance of this()
> or super().
> >
> > + 1 for your proposal, Vimil Saju.
> >
>
> This is not a proposal, it is a question!
>
> The answer to the question has already been given on the list: since
> superclass state of the object is not initialized until after the
> superclass constructor is called, the Java language requires that a call
> to a superclass constructor occur in the first statement of a subclass
> constructor in an attempt to reduce logic errors in initialization.
>
> This restriction is annoying at time, but no one has put forward a
> detailed proposal for how the requirement could be sensibility loosened
> in a way that can be standardized and tested.
>
> -Joe
>
> > -Ulf
> >
> >
> >
> > Am 08.10.2011 01:39, schrieb Daniel Yokomizo:
> >
> >> On Oct 7, 2011 1:58 PM, "Paul Benedict"<pbenedict at apache.org>  wrote:
> >>
> >>> It's a compiler error because the superclass is guaranteed to be
> >>> initialized first before the subclass.
> >>>
> >> Not guaranteed by the JVM, as in anonymous inner classes.
> >>
> >>
> >>> On Fri, Oct 7, 2011 at 11:51 AM, Vimil Saju<vimilsaju at yahoo.com>
>  wrote:
> >>>
> >>>> If you have subclass then java requires that this() or super has to be
> >>>>
> >> first statement in the constructor of the subclass.
> >>
> >>>> Here is an example
> >>>>
> >>>> publicclassMyClass{
> >>>>          publicMyClass(intx){}
> >>>> }
> >>>>
> >>>> publicclassMySubClassextendsMyClass{
> >>>>          publicMySubClass(inta,intb){
> >>>>                  intc =a +b;
> >>>>                  super(c); // COMPILE ERROR
> >>>>          }
> >>>> }The above compilation error can be resolved by rewriting the code in
> >>>>
> >> the constructor as follows
> >>
> >>>> publicclassMySubClassextendsMyClass{
> >>>>          publicMySubClass(inta,intb){
> >>>>                  super(a + b);
> >>>>          }
> >>>> }Can't the Java compiler detect that in the previous code there was no
> >>>>
> >> access to the instance fields or methods and therefore allow the code to
> >> compile without any error.
> >>
> >
> >
>
>
>



More information about the coin-dev mailing list