<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Benji's Blog &#187; Java</title>
	<atom:link href="http://benjiweber.co.uk/blog/tags/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://benjiweber.co.uk/blog</link>
	<description></description>
	<lastBuildDate>Thu, 19 May 2011 23:08:57 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Java Abuse: Inline instanceof</title>
		<link>http://benjiweber.co.uk/blog/2010/09/16/java-abuse-inline-instanceof/</link>
		<comments>http://benjiweber.co.uk/blog/2010/09/16/java-abuse-inline-instanceof/#comments</comments>
		<pubDate>Thu, 16 Sep 2010 20:23:40 +0000</pubDate>
		<dc:creator>benji</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://benjiweber.co.uk/blog/?p=125</guid>
		<description><![CDATA[One annoyance in Java is having to do instanceof checks on multiple lines. e.g.

if &#40;object instanceof Foo&#41; &#123;
    Foo foo = &#40;Foo&#41;object;
    foo.foo&#40;&#41;;
&#125;

While this is often a sign of a design failure, there are times when instanceof checks are required often due to framework constraints etc. The above is [...]]]></description>
			<content:encoded><![CDATA[<p>One annoyance in Java is having to do instanceof checks on multiple lines. e.g.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>object <span style="color: #000000; font-weight: bold;">instanceof</span> Foo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    Foo foo <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>Foo<span style="color: #009900;">&#41;</span>object<span style="color: #339933;">;</span>
    foo.<span style="color: #006633;">foo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>While this is often a sign of a design failure, there are times when instanceof checks are required often due to framework constraints etc. The above is quite ugly and involves using 3 lines instead of 1 for a single method call.  If foo() is a void method we can&#8217;t even use the ternary ? : operator to make it more concise. </p>
<p>In c# with Lambdas and Extension methods one can create something like :</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">    <span style="color: #FF0000;">object</span>.<span style="color: #0000FF;">When</span><span style="color: #008000;">&lt;</span>Foo<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span>foo <span style="color: #008000;">=&gt;</span> foo.<span style="color: #0000FF;">Foo</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Where &#8220;When&#8221; is an extension method added to all objects which takes a type parameter and a lambda to execute if the type parameter matches. (Implementation available if anyone cares).</p>
<p>Since Java doesn&#8217;t have Extension methods or Lambdas yet (Oracle minus minus) we can&#8217;t do this. We can however always use reflection and get something like:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">scratchpad</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.lang.reflect.Method</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">net.sf.cglib.proxy.Enhancer</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">net.sf.cglib.proxy.MethodInterceptor</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">net.sf.cglib.proxy.MethodProxy</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">static</span> scratchpad.<span style="color: #006633;">When</span>.<span style="color: #006633;">when</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Let <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span>... <span style="color: #006633;">args</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">Object</span> a <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">Object</span> b <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;hello world&quot;</span><span style="color: #339933;">;</span>
&nbsp;
		when<span style="color: #009900;">&#40;</span>Foo.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">isTypeOf</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">foo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Prints &quot;foo&quot;</span>
		when<span style="color: #009900;">&#40;</span>Foo.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">isTypeOf</span><span style="color: #009900;">&#40;</span>b<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">foo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Does nothing at all</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Foo <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;foo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> When <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> Is<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> when<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> Class<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> cls<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> Is<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			@SuppressWarnings<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;unchecked&quot;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">public</span> T isTypeOf<span style="color: #009900;">&#40;</span><span style="color: #003399;">Object</span> o<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> o <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">&amp;&amp;</span> cls.<span style="color: #006633;">isAssignableFrom</span><span style="color: #009900;">&#40;</span>o.<span style="color: #006633;">getClass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> 
					<span style="color: #339933;">?</span> <span style="color: #009900;">&#40;</span>T<span style="color: #009900;">&#41;</span>o
					<span style="color: #339933;">:</span> NullObject.<span style="color: #006633;">create</span><span style="color: #009900;">&#40;</span>cls<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> Is<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">public</span> T isTypeOf<span style="color: #009900;">&#40;</span><span style="color: #003399;">Object</span> o<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> NullObject <span style="color: #000000; font-weight: bold;">implements</span> MethodInterceptor  <span style="color: #009900;">&#123;</span>
&nbsp;
	@SuppressWarnings<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;unchecked&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> T create<span style="color: #009900;">&#40;</span>Class<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> cls<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		Enhancer enhancer <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Enhancer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		enhancer.<span style="color: #006633;">setSuperclass</span><span style="color: #009900;">&#40;</span>cls<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		enhancer.<span style="color: #006633;">setCallback</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> NullObject<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span>T<span style="color: #009900;">&#41;</span>enhancer.<span style="color: #006633;">create</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Object</span> intercept<span style="color: #009900;">&#40;</span><span style="color: #003399;">Object</span> o, <span style="color: #003399;">Method</span> method, <span style="color: #003399;">Object</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> os, MethodProxy mp<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Throwable</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://benjiweber.co.uk/blog/2010/09/16/java-abuse-inline-instanceof/feed/</wfw:commentRss>
		<slash:comments>4399</slash:comments>
		</item>
		<item>
		<title>Java Abuse &#8211; Currency Pattern</title>
		<link>http://benjiweber.co.uk/blog/2009/06/18/java-abuse-currency-pattern/</link>
		<comments>http://benjiweber.co.uk/blog/2009/06/18/java-abuse-currency-pattern/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 17:26:12 +0000</pubDate>
		<dc:creator>benji</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://benjiweber.co.uk/blog/?p=72</guid>
		<description><![CDATA[Here&#8217;s a sillier one from last night&#8230;
People often complain about not being able to return multiple values from a method in Java. I can&#8217;t see a good reason for wanting to do this, but some do.
The example I was given was wanting to do:

int foo, bar, baz; list&#40;foo, bar, bar&#41; = func&#40;ponies&#41;;

Where func(ponies) returns 3 [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a sillier one from last night&#8230;</p>
<p>People <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4222792" onclick="javascript:pageTracker._trackPageview('/outbound/article/bugs.sun.com');">often</a> <a href="http://www.javalobby.org/java/forums/t104018.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.javalobby.org');">complain</a> about not being able to return multiple values from a method in Java. I can&#8217;t see a good reason for wanting to do this, but some do.</p>
<p>The example I was given was wanting to do:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">int</span> foo, bar, baz<span style="color: #339933;">;</span> list<span style="color: #009900;">&#40;</span>foo, bar, bar<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> func<span style="color: #009900;">&#40;</span>ponies<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Where func(ponies) returns 3 values which are then assigned to the local variables foo, bar, and baz.</p>
<p>There are plenty of sensible ways of achieving this, but what if we&#8217;re trying to get as close as possible to the above method? We can only return one thing from a method, but that could be a chain. We also can&#8217;t modify the local foo,bar,baz from inside the list method, but we could if we wrap them in references.</p>
<p>If we abuse the fact that <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Character.html#isJavaLetter(char)" onclick="javascript:pageTracker._trackPageview('/outbound/article/java.sun.com');">currency characters are valid identifiers in Java</a>, for the ultimate in unreadability; We can use $(x,y) to be a pair of x and y, $$ to terminate a list, and £(x) to either reference or dereference x.</p>
<p>Then we can do something like this ¬_¬</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #008000; font-style: italic; font-weight: bold;">/** OUTPUT
Foo = 1
Bar = 2
Bingo = Badgers
Baz = 3
**/</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">scratchpad</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">static</span> scratchpad.$.$<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">static</span> scratchpad.$$.$$<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">static</span> scratchpad.$.<span style="color: #006633;">expand</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">static</span> scratchpad.£.£<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MultipleReturn
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span>... <span style="color: #006633;">args</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">new</span> MultipleReturn<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">demo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> demo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		£<span style="color: #339933;">&lt;</span>Integer<span style="color: #339933;">&gt;</span> foo <span style="color: #339933;">=</span> £<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span>1<span style="color: #009900;">&#41;</span>, bar <span style="color: #339933;">=</span> £<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span>1<span style="color: #009900;">&#41;</span>, baz <span style="color: #339933;">=</span> £<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span>1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		£<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span> bingo <span style="color: #339933;">=</span> £<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		expand<span style="color: #009900;">&#40;</span>foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">into</span><span style="color: #009900;">&#40;</span>foo,bar,bingo,baz<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Foo = &quot;</span> <span style="color: #339933;">+</span> £<span style="color: #009900;">&#40;</span>foo<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Bar = &quot;</span> <span style="color: #339933;">+</span> £<span style="color: #009900;">&#40;</span>bar<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Bingo = &quot;</span> <span style="color: #339933;">+</span> £<span style="color: #009900;">&#40;</span>bingo<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Baz = &quot;</span> <span style="color: #339933;">+</span> £<span style="color: #009900;">&#40;</span>baz<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> $<span style="color: #339933;">&lt;</span>Integer,$<span style="color: #339933;">&lt;</span>Integer,$<span style="color: #339933;">&lt;</span>String,$<span style="color: #339933;">&lt;</span>Integer,$$<span style="color: #339933;">&gt;&gt;&gt;&gt;</span> foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> $<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span>,$<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span>,$<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Badgers&quot;</span>,$<span style="color: #009900;">&#40;</span>3,$$<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">interface</span> Tuple <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> $$ <span style="color: #000000; font-weight: bold;">implements</span> Tuple
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> $$<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> $$ $$ <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> $$<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> $<span style="color: #339933;">&lt;</span>T,U <span style="color: #000000; font-weight: bold;">extends</span> Tuple<span style="color: #339933;">&gt;</span> <span style="color: #000000; font-weight: bold;">implements</span> Tuple
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> T _1<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">public</span> U _2<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">protected</span> $<span style="color: #009900;">&#40;</span>T t,U u<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>._1 <span style="color: #339933;">=</span> t<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>._2 <span style="color: #339933;">=</span> u<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> $<span style="color: #339933;">&lt;</span>T,$$<span style="color: #339933;">&gt;</span> $<span style="color: #009900;">&#40;</span>T t<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> $<span style="color: #339933;">&lt;</span>T,$$<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span>t,$$<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #339933;">&lt;</span>T,U <span style="color: #000000; font-weight: bold;">extends</span> Tuple<span style="color: #339933;">&gt;</span> $<span style="color: #339933;">&lt;</span>T,U<span style="color: #339933;">&gt;</span> $<span style="color: #009900;">&#40;</span>T t, U u<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> $<span style="color: #339933;">&lt;</span>T,U<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span>t,u<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> Expander
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> into<span style="color: #009900;">&#40;</span>£... <span style="color: #006633;">refs</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> Expander expand<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> $<span style="color: #339933;">&lt;?</span>,<span style="color: #339933;">?</span> <span style="color: #000000; font-weight: bold;">extends</span> Tuple<span style="color: #339933;">&gt;</span> vals<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> Expander<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> into<span style="color: #009900;">&#40;</span>scratchpad.£... <span style="color: #006633;">refs</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>refs.<span style="color: #006633;">length</span> <span style="color: #339933;">&lt;</span> 1<span style="color: #009900;">&#41;</span>
					<span style="color: #000000; font-weight: bold;">return</span><span style="color: #339933;">;</span>
&nbsp;
				$ current <span style="color: #339933;">=</span> vals<span style="color: #339933;">;</span>
				refs<span style="color: #009900;">&#91;</span>0<span style="color: #009900;">&#93;</span>._1 <span style="color: #339933;">=</span> current._1<span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>current._2 <span style="color: #000000; font-weight: bold;">instanceof</span> $$<span style="color: #009900;">&#41;</span>
					<span style="color: #000000; font-weight: bold;">return</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>current._2 <span style="color: #000000; font-weight: bold;">instanceof</span> $$<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#123;</span>
					<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">&gt;=</span> refs.<span style="color: #006633;">length</span><span style="color: #009900;">&#41;</span>
						<span style="color: #000000; font-weight: bold;">return</span><span style="color: #339933;">;</span>
					current <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#41;</span>current._2<span style="color: #339933;">;</span>
					refs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>._1 <span style="color: #339933;">=</span> current._1<span style="color: #339933;">;</span>
					i<span style="color: #339933;">++;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> £<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> <span style="color: #000000; font-weight: bold;">extends</span> $<span style="color: #339933;">&lt;</span>T,$$<span style="color: #339933;">&gt;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">protected</span> £<span style="color: #009900;">&#40;</span>T t<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span>t,$$<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> £<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> £<span style="color: #009900;">&#40;</span>T t<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> £<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span>t<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> T £<span style="color: #009900;">&#40;</span>£<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> t<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> t._1<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://benjiweber.co.uk/blog/2009/06/18/java-abuse-currency-pattern/feed/</wfw:commentRss>
		<slash:comments>1537</slash:comments>
		</item>
		<item>
		<title>Java Abuse &#8211; Ternary Try/Catch</title>
		<link>http://benjiweber.co.uk/blog/2009/06/14/java-abuse-ternary-trycatch/</link>
		<comments>http://benjiweber.co.uk/blog/2009/06/14/java-abuse-ternary-trycatch/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 13:03:27 +0000</pubDate>
		<dc:creator>benji</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://benjiweber.co.uk/blog/?p=46</guid>
		<description><![CDATA[We often discuss Java limitations on IRC and try to come up with (sometimes silly) workarounds. Unfortunately after time passes it&#8217;s often easy to forget the outcome, and lose code snippets. So I thought I&#8217;d start blogging some of them so I don&#8217;t lose them, and other people might suggest other ways of doing things [...]]]></description>
			<content:encoded><![CDATA[<p>We often discuss Java limitations on IRC and try to come up with (sometimes silly) workarounds. Unfortunately after time passes it&#8217;s often easy to forget the outcome, and lose code snippets. So I thought I&#8217;d start blogging some of them so I don&#8217;t lose them, and other people might suggest other ways of doing things that we&#8217;ve overlooked.</p>
<p>This particular problem occurs when you want to assign the result of a method that can throw an exception to a final variable. For example:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">final</span> Customer c<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">try</span>
<span style="color: #009900;">&#123;</span>
	c <span style="color: #339933;">=</span> getCustomer<span style="color: #009900;">&#40;</span>id<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>CustomerNotFoundException e<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	c <span style="color: #339933;">=</span> createNewCustomer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>This will fail to compile with &#8220;variable c might already have been assigned&#8221;. Of course making c not final would solve the problem, but that&#8217;s no fun.</p>
<p>If we were not using Exceptions, Java provides a useful ternary operator &#8220;?:&#8221; that lets us do things like:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">final</span> Customer c <span style="color: #339933;">=</span> customerExists<span style="color: #009900;">&#40;</span>id<span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> getCustomer<span style="color: #009900;">&#40;</span>id<span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> createNewCustomer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Which is nice and clean, but means that getCustomer is going to have to return null or throw a RuntimeException in the case that there is no matching customer, which is undesirable. Also  customerExists() may be expensive.</p>
<p>We could also possibly use something along the lines of</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">final</span> Option<span style="color: #339933;">&lt;</span>Customer<span style="color: #339933;">&gt;</span> c <span style="color: #339933;">=</span> getCustomer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Both of these alternatives, however, require changing the API you&#8217;re consuming, and avoiding Exceptions. It would be nice if there was an equivalent of &#8220;?:&#8221; for try/catch so that you could assign the result to a final variable. The best I can manage in Java is below, can anyone do better?</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.lang.reflect.ParameterizedType</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> TryCatch<span style="color: #339933;">&lt;</span>T, U <span style="color: #000000; font-weight: bold;">extends</span> Exception<span style="color: #339933;">&gt;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> T value<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">try</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">Try</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> e<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>getTypeOfU<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">isAssignableFrom</span><span style="color: #009900;">&#40;</span>e.<span style="color: #006633;">getClass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">Catch</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">RuntimeException</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@SuppressWarnings<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;unchecked&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">private</span> Class<span style="color: #339933;">&lt;</span>U<span style="color: #339933;">&gt;</span> getTypeOfU<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span>Class<span style="color: #339933;">&lt;</span>U<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>ParameterizedType<span style="color: #009900;">&#41;</span> getClass<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getGenericSuperclass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getActualTypeArguments</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span>1<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> T <span style="color: #000000; font-weight: bold;">Try</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> U<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> T <span style="color: #000000; font-weight: bold;">Catch</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Example</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Main
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> CustomerRepo repo <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CustomerRepo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> 
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">final</span> Customer c <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TryCatch<span style="color: #339933;">&lt;</span>Customer, CustomerNotFoundException<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">public</span> Customer <span style="color: #000000; font-weight: bold;">Try</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> CustomerNotFoundException
			<span style="color: #009900;">&#123;</span>
				<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;in try&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">return</span> repo.<span style="color: #006633;">getCustomer</span><span style="color: #009900;">&#40;</span>1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">public</span> Customer <span style="color: #000000; font-weight: bold;">Catch</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;in catch&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">return</span> repo.<span style="color: #006633;">createCustomer</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>.<span style="color: #006633;">value</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> CustomerRepo
<span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Customer getCustomer<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> id<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> CustomerNotFoundException
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> CustomerNotFoundException<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Customer createCustomer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> Customer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Customer
<span style="color: #009900;">&#123;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> CustomerNotFoundException <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #003399;">Exception</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>In C# we don&#8217;t run into the same problem since <a href="http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/msdn.microsoft.com');">readonly</a> is much less useful than Java&#8217;s <a href="http://mindprod.com/jgloss/final.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/mindprod.com');">final</a>. However, if we wanted to try/catch at the same time we can do a bit better. Here&#8217;s an alternative in C#:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> Example
<span style="color: #000000;">&#123;</span>
	<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		Example t <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Example<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		t.<span style="color: #0000FF;">Foo</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
	<span style="color: #000000;">&#125;</span>
&nbsp;
	<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Foo<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		<span style="color: #FF0000;">String</span> result1 <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0600FF;">Try</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> GetBar<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0600FF;">Catch</span><span style="color: #008000;">&lt;</span>BarException<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> <span style="color: #666666;">&quot;Caught a BarException&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		<span style="color: #FF0000;">String</span> result2 <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0600FF;">Try</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> GetBar<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">false</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0600FF;">Catch</span><span style="color: #008000;">&lt;</span>BarException<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> <span style="color: #666666;">&quot;Caught a BarException&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>result1<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>result2<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
	<span style="color: #000000;">&#125;</span>
&nbsp;
	<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">String</span> GetBar<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">bool</span> succeed<span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>succeed<span style="color: #000000;">&#41;</span>
			<span style="color: #0600FF;">return</span> <span style="color: #666666;">&quot;Success!&quot;</span><span style="color: #008000;">;</span>
		<span style="color: #0600FF;">else</span>
			<span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> BarException<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> BarException <span style="color: #008000;">:</span> Exception <span style="color: #000000;">&#123;</span><span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> Tryer<span style="color: #008000;">&lt;</span>TResult<span style="color: #008000;">&gt;</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #0600FF;">private</span> <span style="color: #0600FF;">readonly</span> Func<span style="color: #008000;">&lt;</span>TResult<span style="color: #008000;">&gt;</span> toTry<span style="color: #008000;">;</span>
	<span style="color: #0600FF;">internal</span> Tryer<span style="color: #000000;">&#40;</span>Func<span style="color: #008000;">&lt;</span>TResult<span style="color: #008000;">&gt;</span> toTry<span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		<span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">toTry</span> <span style="color: #008000;">=</span> toTry<span style="color: #008000;">;</span>
	<span style="color: #000000;">&#125;</span>
&nbsp;
	<span style="color: #0600FF;">public</span> TResult <span style="color: #0600FF;">Catch</span><span style="color: #008000;">&lt;</span>TException<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span>Func<span style="color: #008000;">&lt;</span>TResult<span style="color: #008000;">&gt;</span> whenCaught<span style="color: #000000;">&#41;</span>
		where TException <span style="color: #008000;">:</span> Exception
	<span style="color: #000000;">&#123;</span>
		<span style="color: #0600FF;">try</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #0600FF;">return</span> toTry<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		<span style="color: #000000;">&#125;</span> <span style="color: #0600FF;">catch</span> <span style="color: #000000;">&#40;</span>TException<span style="color: #000000;">&#41;</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #0600FF;">return</span> whenCaught<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		<span style="color: #000000;">&#125;</span>
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">namespace</span> <span style="color: #000000;">System</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">class</span> ProvidesTry
	<span style="color: #000000;">&#123;</span>
		<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> Tryer<span style="color: #008000;">&lt;</span>TResult<span style="color: #008000;">&gt;</span> <span style="color: #0600FF;">Try</span><span style="color: #008000;">&lt;</span>T,TResult<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span> T other, Func<span style="color: #008000;">&lt;</span>TResult<span style="color: #008000;">&gt;</span> toTry<span style="color: #000000;">&#41;</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> Tryer<span style="color: #008000;">&lt;</span>TResult<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span>toTry<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		<span style="color: #000000;">&#125;</span> 
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://benjiweber.co.uk/blog/2009/06/14/java-abuse-ternary-trycatch/feed/</wfw:commentRss>
		<slash:comments>3480</slash:comments>
		</item>
	</channel>
</rss>

