Path: csiph.com!x330-a1.tempe.blueboxinc.net!newsfeed.hal-mli.net!feeder1.hal-mli.net!nx02.iad01.newshosting.com!newshosting.com!news-out.readnews.com!news-xxxfer.readnews.com!postnews.google.com!news4.google.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Robert Klemme Newsgroups: comp.lang.java.programmer Subject: Re: Using Enumerated Types as Array Indexes Date: Wed, 17 Aug 2011 19:02:07 +0200 Lines: 53 Message-ID: <9b2aglFuj7U1@mid.individual.net> References: <4e4b0d81$0$314$14726298@news.sunsite.dk> <4e4b1fe4$0$314$14726298@news.sunsite.dk> <6d418cda-dab3-43df-a9ec-293b43f2bbd8@glegroupsg2000goo.googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Trace: individual.net E9TuN+2kXeLiECy9PfquXQXMKehYR29qA9HrSAUvbKsXh8JXw= Cancel-Lock: sha1:F0LVqGv/WgluCOaPlcWXyUMvaNM= User-Agent: Mozilla/5.0 (Windows NT 6.0; WOW64; rv:5.0) Gecko/20110624 Thunderbird/5.0 In-Reply-To: Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:7163 On 17.08.2011 16:17, Lew wrote: > Andreas Leitgeb wrote: >> Arved Sandstrom wrote: >>> Lew wrote: >>>> JLS 10: [...] IOW, you never index arrays with a byte, char or >>>> short. [...] >>> I'm feeling slow this morning: how do we get problems with >>> byte->int, short->int, or char->int again? > > One gets problems with byte->int and short->int with array indexes > the way one gets into trouble with those widening conversions > generally. The usual suspect is the lack of unsigned versions, so > widening a (byte)0xA0, for example, would result in a negative > index. > > One gets into trouble generally in programming when one thinks one > thing is going on ("index takes a byte") whilst ignoring what's > really going on (there's a widening conversion involved). You might > get away with it most of the time, but occasionally such things trip > you up. Why had a nice issue recently which exactly fits this bill: after over two months of uninterrupted, completely error free production usage the application suddenly stopped working giving weird error messages (there was an issue with the error reporting as well, but let's ignore that for the moment). Turns out this was the setup: 1. There was an AtomicInteger initialized at startup with 0 which for every request coming into that system was incremented in a thread safe manner (incrementAndGet()). 2. The result was used to index into an array with the quite obvious "arr[n % arr.length]". 3. (left as exercise for the reader) Anybody who now thinks all is fine should stop coding Java immediately and go reading the language spec. > Why think about it imprecisely? Tell us the advantage of that, > please. Some may reason: Someone else might have to pay for the laziness. But then again, the risk is it might come right back haunting the originator. Well, no risk, no fun. :-) Cheers robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/