Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.java.programmer > #5773
| From | Eric Sosman <esosman@ieee-dot-org.invalid> |
|---|---|
| Newsgroups | comp.lang.java.programmer |
| Subject | Re: Automatic linking of related objects in constructor |
| Date | 2011-06-29 08:29 -0400 |
| Organization | A noiseless patient Spider |
| Message-ID | <iuf5rd$26m$1@dont-email.me> (permalink) |
| References | <eYKdnUijTfibapfTnZ2dnUVZ_uadnZ2d@westnet.com.au> |
On 6/29/2011 5:56 AM, Qu0ll wrote:
> Suppose you have class A which contains a list of objects of class B and
> that the constructor for B takes in a reference to the A object which is
> to include it in said list. Is it safe to make a call to A's method
> addB(B b) in that B constructor passing in "this"? I have heard that
> it's bad practice to "leak" a reference to an object from within its own
> constructor because it may be in an invalid state.
I guess you mean
class B {
public B(A a) {
...
a.addB(this);
}
...
}
It's not a wonderful idea, but even if it's not safe it looks sort
of safe-ish, right? Ah, but code changes, and lo! one of the
changes introduces a subclass:
class C extends B {
public C(A a) {
super(a);
...
}
}
Okay, still not *too* bad -- or is it? Let's expand that last
set of ellipses:
class C extends B {
public C(A a) {
super(a);
if (phaseOfTheMoon() != Moon.FULL)
throw new IllegalStateException();
...
}
}
Yikes! Now if C's constructor throws up, the A instance is left
holding a reference to something that appears to be a C in B's
clothing, but is in fact nothing sensible at all!
> If not, how else can I automatically add the B object to the list in A
> without forcing the client programmer to explicitly call addB() given
> that they have already passed in the B as an argument?
(I assume you meant "A as an argument.") Consider using a
factory method:
class B {
private B(A a) {
// so clients can't do "new B(a)"
...
}
public static B instanceOf(A a) {
B b = new B(a);
// B's constructor is now completely finished
a.addB(b);
return b;
}
}
--
Eric Sosman
esosman@ieee-dot-org.invalid
Back to comp.lang.java.programmer | Previous | Next — Previous in thread | Next in thread | Find similar
Automatic linking of related objects in constructor "Qu0ll" <Qu0llSixFour@gmail.com> - 2011-06-29 19:56 +1000
Re: Automatic linking of related objects in constructor "Qu0ll" <Qu0llSixFour@gmail.com> - 2011-06-29 19:58 +1000
Re: Automatic linking of related objects in constructor Lew <noone@lewscanon.com> - 2011-06-29 07:28 -0400
Re: Automatic linking of related objects in constructor Eric Sosman <esosman@ieee-dot-org.invalid> - 2011-06-29 08:29 -0400
Re: Automatic linking of related objects in constructor Tom Anderson <twic@urchin.earth.li> - 2011-06-30 22:51 +0100
Re: Automatic linking of related objects in constructor supercalifragilisticexpialadiamaticonormalizeringelimatisticantations <supercalifragilisticexpialadiamaticonormalizeringelimatisticantations@averylongandannoyingdomainname.com> - 2011-06-30 18:23 -0400
Re: Automatic linking of related objects in constructor markspace <-@.> - 2011-06-29 09:17 -0700
Re: Automatic linking of related objects in constructor supercalifragilisticexpialadiamaticonormalizeringelimatisticantations <supercalifragilisticexpialadiamaticonormalizeringelimatisticantations@averylongandannoyingdomainname.com> - 2011-06-29 19:58 -0400
csiph-web