Path: csiph.com!x330-a1.tempe.blueboxinc.net!feeder1.hal-mli.net!nx02.iad01.newshosting.com!newshosting.com!news-out.readnews.com!transit3.readnews.com!postnews.google.com!y27g2000prb.googlegroups.com!not-for-mail From: Robert Klemme Newsgroups: comp.lang.java.programmer Subject: Re: About using assertion Date: Thu, 19 May 2011 07:41:23 -0700 (PDT) Organization: http://groups.google.com Lines: 117 Message-ID: <1c7e8d56-fe50-4366-a4d2-33ca818960de@y27g2000prb.googlegroups.com> References: <92r0e9F6lvU1@mid.individual.net> NNTP-Posting-Host: 193.0.246.21 Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Trace: posting.google.com 1305816083 24967 127.0.0.1 (19 May 2011 14:41:23 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Thu, 19 May 2011 14:41:23 +0000 (UTC) Complaints-To: groups-abuse@google.com Injection-Info: y27g2000prb.googlegroups.com; posting-host=193.0.246.21; posting-account=MGO7qgoAAABvyo26eHVDO00044spH-ws User-Agent: G2/1.0 X-HTTP-Via: 1.1 webwasher (Webwasher 6.7.2.3448) X-HTTP-UserAgent: Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1,gzip(gfe) Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:4298 On 19 Mai, 15:38, Lew wrote: > On 05/19/2011 09:16 AM, Michal Kleczek wrote: > > > > > > > > > > > Lew wrote: > > >> That is wrong. =A0That needs to be checked with an 'if' if 'NaN' is no= t a > >> legitimate input. =A0'assert' is not meant to correct things, only to = make > >> sure > > > I totally agree with you. > > >> that the correction is documented and proven. =A0If 'assert' is turned= off > >> in production, you still have the bug if you use 'assert' as the only > >> guard. > > > I was imprecise - just wanted to praise an example of "having confidenc= e" > > being sooo wrong and how having assertions (even though they look redun= dant) > > _may_ help you. > > Totally correct. > > Assertions are a signpost: HERE THERE BE AN INVARIANT! > > When subtypes or refactored code violate the invariant, the assertion can= help > catch it. > > =A0 public class Foo > =A0 { > =A0 =A0 private Attribute attribute; > > =A0 =A0 public void setAttribute( Attribute attr ) > =A0 =A0 { > =A0 =A0 =A0 if ( attr =3D=3D null ) > =A0 =A0 =A0 { > =A0 =A0 =A0 =A0 throw new IllegalArgumentException( "null argument, dummy= " ); > =A0 =A0 =A0 } > =A0 =A0 =A0 attribute =3D attr; > =A0 =A0 =A0 assert attribute !=3D null; > =A0 =A0 } > > =A0 =A0 public Attribute getAttribute() > =A0 =A0 { > =A0 =A0 =A0 assert attribute !=3D null; > =A0 =A0 =A0 return attribute; > =A0 =A0 } > =A0 } > > =A0 public class Bar extends Foo() > =A0 { > =A0 =A0 public void setAttribute( Attribute attr ) > =A0 =A0 { > =A0 =A0 =A0 attribute =3D attr; Sorry for the nitpicking, but this cannot compile unless you make "attribute" protected or package visible. But that in itself would be a code smell IMHO. (Even though Java's std lib uses protected in various places. But that's a completely different topic...) > =A0 =A0 } > =A0 } > > The assertion will help reveal that class 'Bar' violated the invariant. = =A0In > production, the 'NullPointerException' (in the logs from 'getAttribute()' > clients) will trigger an investigation, which will include enabling asser= tions > for the class that yields the value, and then the invariant checks will h= elp > find the problem. I think I get your point about the usage of assert here but we might find a better example. In this particular case the NPE would catch misbehaved sub class code anyway which must go through setAttribute if the member variable remains declared "private" (my preferred solution). How about this as an example using template method pattern. public abstract class Base { /** Sub classes must override this and return an Attribute * where {@link Attribute#getProperty()} returns something * useful (!=3D null). * @return an Attribute with Property, not null. */ protected abstract Attribute getAttribute(); /** This is the great algorithm this class is all about. */ public void theAlgorithm() { final Attribute at =3D getAttribute(); /* We use individual asserts instead of && to easier find the * violated rule. */ assert at !=3D null; assert at.getProperty() !=3D null; // now we can start working System.out.println("Now this works: " + at.getProperty().getLength()); } } Kind regards robert