Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #2971

Re: calling own methods from constructor

From Owen Jacobson <angrybaldguy@gmail.com>
Newsgroups comp.lang.java.programmer
Message-ID <2011040723213981856-angrybaldguy@gmailcom> (permalink)
References <slrnippkd9.phi.avl@gamma.logic.tuwien.ac.at> <2011040622233261380-angrybaldguy@gmailcom> <2pzko2f2nx.fsf@shell.xmission.com> <ce5128fc-f160-41f9-846a-71b1646dad33@hd10g2000vbb.googlegroups.com> <2pwrj56744.fsf@shell.xmission.com>
Subject Re: calling own methods from constructor
Date 2011-04-07 23:21 -0400

Show all headers | View raw


On 2011-04-07 18:15:23 -0400, Jim Janney said:

> Lew <lew@lewscanon.com> writes:
> 
>> Janney wrote:
>>> In Java evaluating new Bar() will throw an exception.  But in C++ the
>>> equivalent code would print
>>> 
>>> Override me! I dare you.
>>> Two guys walk into a...
>>> 
>>> In effect, until the constructor of Foo completes, the object is
>>> considered to be an instance of Foo, so calls to virtualMethod() to to
>>> Foo.virtualMethod even if it has been overridden.  After the super
>>> constructor completes, the object is treated as an instance of Bar, so
>>> evaluating new Bar().virtualMethod() would print two lines and then
>>> throw an exception.
>>> 
>>> I've been surprised by this behaviour in C++ enough times that I'm not
>>> sure that it has the better approach.  But a solution does exist.
>>> 
>> 
>> A solution to what, exactly?

Lew, bog off.

> In the message I was replying to, in the text that you deleted, Owen
> Jacobsen correctly observed that

Jacobson. Like the UML guy, to my eternal mortification. :)

>>>> It's hard to prove that a constructor never calls a virtual method. Consider:
> 
> This is a technical issue, and I observed that other languages have
> found ways to prevent virtual methods from being called before their
> owning objects have been fully constructed.  One can debate whether this
> desirable, but C++ provides an existence proof that it's possible.

Sure. C++'s objection initialization proceeds from the top down, just 
like Java's, with the difference that the class of '*this' changes as 
constructors complete. In your extension of my example, with

	public class Foo { /* ... */ }

	public class Bar extends Foo { /* ... */ }

this would mean that during Foo's constructor, 'this' points to a Foo 
object, while during Bar's constructor, it points to a Bar object*. 
However, in Java, constructor chaining is syntactically a statement, so 
it appears that control flow begins in the most-derived class's 
constructor before chaining upwards through each superclass's 
constructor to Object() -- and that's exactly what happens under the 
hood!

	$ cat Surprise.java
	class Surprise {
	    public Surprise(String s) {
	        super(); // explicit for the sake of discussion only.
	    }
	}
	
	class Subprise extends Surprise {
	    public Subprise() {
	        super("Hello, world!");
	    }
	}
	
	$ javap -classpath . Subprise -c
	Compiled from "Surprise.java"
	class Subprise extends Surprise{
	public Subprise();
	  Code:
	   0:	aload_0
	   1:	ldc	#1; //String Hello, world!
	   3:	invokespecial	#2; //Method Surprise."<init>":(Ljava/lang/String;)V
	   6:	return
	
	}

Given that JVM-level implementation of constructors, having the class 
of 'this' change after the third instruction would be very tricky to 
implement. C++ doesn't have this problem, since (a) constructor 
chaining is NOT syntactically like a statement and (b) constructor 
chaining doesn't have to compile like one, either.

Could it have been designed differently? Sure. Java's constructor 
semantics are a weird-but-mostly-intuitive mix of C++'s constructors 
and Smalltalk's initializers-are-just-methods approach (where you're 
not forced to chain to a parent class's initializer at all). It's a 
compromise, and like all compromises, it's not quite like any of the 
alternatives; however, I think having the type of 'this' remain stable 
is a useful feature. :)

-o

* And also that if Foo.Foo() captures 'this' in a field, Bar.Bar() can 
compare this to the field using == and get true back, even though the 
class has changed. 'new' is only allowed to introduce one distinct new 
pointer.

Back to comp.lang.java.programmer | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

calling own methods from constructor Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> - 2011-04-06 20:48 +0000
  Re: calling own methods from constructor Tom Anderson <twic@urchin.earth.li> - 2011-04-06 23:06 +0100
    Re: calling own methods from constructor Lew <noone@lewscanon.com> - 2011-04-06 18:24 -0400
      Re: calling own methods from constructor Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> - 2011-04-07 08:44 +0000
        Re: calling own methods from constructor Robert Klemme <shortcutter@googlemail.com> - 2011-04-07 04:14 -0700
          Re: calling own methods from constructor Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> - 2011-04-07 12:32 +0000
            Re: calling own methods from constructor Robert Klemme <shortcutter@googlemail.com> - 2011-04-07 05:55 -0700
            Re: calling own methods from constructor Lew <lew@lewscanon.com> - 2011-04-07 08:10 -0700
              Re: calling own methods from constructor Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> - 2011-04-07 20:31 +0000
                Re: calling own methods from constructor Lew <lew@lewscanon.com> - 2011-04-07 14:10 -0700
                Re: calling own methods from constructor Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> - 2011-04-07 22:15 +0000
                Re: calling own methods from constructor Lew <noone@lewscanon.com> - 2011-04-07 21:22 -0400
              Re: calling own methods from constructor Tom Anderson <twic@urchin.earth.li> - 2011-04-07 23:08 +0100
                Re: calling own methods from constructor Lew <noone@lewscanon.com> - 2011-04-07 21:24 -0400
                Re: calling own methods from constructor "Mike Schilling" <mscottschilling@hotmail.com> - 2011-04-09 22:06 -0700
            Re: calling own methods from constructor Tom Anderson <twic@urchin.earth.li> - 2011-04-07 23:10 +0100
              Re: calling own methods from constructor Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> - 2011-04-07 22:24 +0000
        Re: calling own methods from constructor Lew <noone@lewscanon.com> - 2011-04-07 07:19 -0400
          Re: calling own methods from constructor Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> - 2011-04-07 12:24 +0000
    Re: calling own methods from constructor Eric Sosman <esosman@ieee-dot-org.invalid> - 2011-04-06 20:46 -0400
    Re: calling own methods from constructor Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> - 2011-04-07 08:36 +0000
      Re: calling own methods from constructor Arved Sandstrom <asandstrom3minus1@eastlink.ca> - 2011-04-07 07:16 -0300
        Re: calling own methods from constructor Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> - 2011-04-07 11:26 +0000
      Re: calling own methods from constructor Paul Cager <paul.cager@googlemail.com> - 2011-04-07 03:20 -0700
        Re: calling own methods from constructor Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> - 2011-04-07 11:36 +0000
  Re: calling own methods from constructor Owen Jacobson <angrybaldguy@gmail.com> - 2011-04-06 22:23 -0400
    Re: calling own methods from constructor Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> - 2011-04-07 09:13 +0000
      Re: calling own methods from constructor Tobias Blass <tobiasblass@gmx.net> - 2011-04-07 10:58 +0000
        Re: calling own methods from constructor Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> - 2011-04-07 12:19 +0000
          Re: calling own methods from constructor Alessio Stalla <alessiostalla@gmail.com> - 2011-04-07 10:40 -0700
            Re: calling own methods from constructor Tobias Blass <tobiasblass@gmx.net> - 2011-04-07 19:00 +0000
              Re: calling own methods from constructor Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> - 2011-04-07 20:11 +0000
              Re: calling own methods from constructor Jim Janney <jjanney@shell.xmission.com> - 2011-04-07 14:36 -0600
              Re: calling own methods from constructor Eric Sosman <esosman@ieee-dot-org.invalid> - 2011-04-07 20:59 -0400
    Re: calling own methods from constructor Jim Janney <jjanney@shell.xmission.com> - 2011-04-07 10:26 -0600
      Re: calling own methods from constructor Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> - 2011-04-07 20:16 +0000
      Re: calling own methods from constructor Lew <lew@lewscanon.com> - 2011-04-07 14:05 -0700
        Re: calling own methods from constructor Jim Janney <jjanney@shell.xmission.com> - 2011-04-07 16:15 -0600
          Re: calling own methods from constructor Lew <noone@lewscanon.com> - 2011-04-07 21:28 -0400
          Re: calling own methods from constructor Owen Jacobson <angrybaldguy@gmail.com> - 2011-04-07 23:21 -0400
            Re: calling own methods from constructor Owen Jacobson <angrybaldguy@gmail.com> - 2011-04-07 23:39 -0400
            Re: calling own methods from constructor Owen Jacobson <angrybaldguy@gmail.com> - 2011-04-07 23:58 -0400
            Re: calling own methods from constructor Tom Anderson <twic@urchin.earth.li> - 2011-04-08 20:32 +0100
      Re: calling own methods from constructor Tom Anderson <twic@urchin.earth.li> - 2011-04-07 23:05 +0100
        Re: calling own methods from constructor Jim Janney <jjanney@shell.xmission.com> - 2011-04-07 17:38 -0600
  Re: calling own methods from constructor Roedy Green <see_website@mindprod.com.invalid> - 2011-04-07 03:20 -0700
    Re: calling own methods from constructor Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> - 2011-04-07 11:32 +0000
  Re: calling own methods from constructor Daniele Futtorovic <da.futt.news@laposte-dot-net.invalid> - 2011-04-08 01:51 +0200
    Re: calling own methods from constructor Daniele Futtorovic <da.futt.news@laposte-dot-net.invalid> - 2011-04-08 01:56 +0200
      Re: calling own methods from constructor Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> - 2011-04-08 09:30 +0000
        Re: calling own methods from constructor Daniele Futtorovic <da.futt.news@laposte-dot-net.invalid> - 2011-04-08 20:02 +0200

csiph-web