<?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/posts/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>Typesafe Hibernate POJO Queries without code generation</title>
		<link>http://benjiweber.co.uk/blog/2011/05/20/typesafe-hibernate-pojo-queries-without-code-generation/</link>
		<comments>http://benjiweber.co.uk/blog/2011/05/20/typesafe-hibernate-pojo-queries-without-code-generation/#comments</comments>
		<pubDate>Thu, 19 May 2011 23:08:57 +0000</pubDate>
		<dc:creator>benji</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://benjiweber.co.uk/blog/?p=133</guid>
		<description><![CDATA[Hibernate is great, but often one has to specify queries as HQL in Strings, or as criteria which allow building of invalid queries.


It would be great to use the java type system to help enforce correct queries. I am aware of some tools to do this, but all the ones I have seen require either [...]]]></description>
			<content:encoded><![CDATA[<p>Hibernate is great, but often one has to specify queries as HQL in Strings, or as criteria which allow building of invalid queries.
</p>
<p>
It would be great to use the java type system to help enforce correct queries. I am aware of some tools to do this, but all the ones I have seen require either a code generation step, or preclude the use of standard getters/setters.
</p>
<p>
Here is a proof of concept of one approach that I think could work. It allows things like:
</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">public</span> List<span style="color: #339933;">&lt;</span>Person<span style="color: #339933;">&gt;</span> getPeopleByName<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> firstName, <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> lastName<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> Query<span style="color: #339933;">&lt;</span>Person<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> CompletedQuery spec<span style="color: #009900;">&#40;</span>Person person<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// &lt;- Only Person can be passed to here.</span>
                <span style="color: #000000; font-weight: bold;">return</span> where<span style="color: #009900;">&#40;</span>person.<span style="color: #006633;">getFirstname</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
                    .<span style="color: #006633;">equalTo</span><span style="color: #009900;">&#40;</span>firstName<span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// &lt;- Only comparisons are valid at this step, a .and(... would be a compilefailure.</span>
                    .<span style="color: #006633;">and</span><span style="color: #009900;">&#40;</span>person.<span style="color: #006633;">getLastname</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
                    .<span style="color: #006633;">equalTo</span><span style="color: #009900;">&#40;</span>lastName<span style="color: #009900;">&#41;</span>
                    .<span style="color: #006633;">select</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;">// &lt;- Omitting this would be a compile failure due to return type.</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>.<span style="color: #006633;">list</span><span style="color: #009900;">&#40;</span>HibernateUtil.<span style="color: #006633;">getSessionFactory</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getCurrentSession</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: #666666; font-style: italic;">// &lt;- Method returns a List&lt;Person&gt;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>
A toString on the above Query&lt;Person&gt; when passed firstname benji and lastname weber would yield:
</p>
<pre>
FROM Person WHERE firstname = 'benji' AND lastname = 'weber'
</pre>
<p>
If we were to try to supply a non-string value for first name we would get a compile failure.
</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">public</span> List<span style="color: #339933;">&lt;</span>Person<span style="color: #339933;">&gt;</span> getPeopleByName<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> firstName, <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> lastName<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> Query<span style="color: #339933;">&lt;</span>Person<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> CompletedQuery spec<span style="color: #009900;">&#40;</span>Person person<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">return</span> where<span style="color: #009900;">&#40;</span>person.<span style="color: #006633;">getFirstname</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
                    .<span style="color: #006633;">equalTo</span><span style="color: #009900;">&#40;</span>firstName<span style="color: #009900;">&#41;</span>
                    .<span style="color: #006633;">and</span><span style="color: #009900;">&#40;</span>person.<span style="color: #006633;">getLastname</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
                    .<span style="color: #006633;">equalTo</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// &lt;- Compile failure</span>
                    .<span style="color: #006633;">select</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;">list</span><span style="color: #009900;">&#40;</span>HibernateUtil.<span style="color: #006633;">getSessionFactory</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getCurrentSession</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;">&#125;</span></pre></div></div>

<p>
This approach can even work querying through relationships
</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">public</span> List<span style="color: #339933;">&lt;</span>Person<span style="color: #339933;">&gt;</span> getPeopleByAddress<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> Address address<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> Query<span style="color: #339933;">&lt;</span>Person<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> CompletedQuery spec<span style="color: #009900;">&#40;</span>Person person<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">return</span> where<span style="color: #009900;">&#40;</span>person.<span style="color: #006633;">getAddress</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
                    .<span style="color: #006633;">equalTo</span><span style="color: #009900;">&#40;</span>address.<span style="color: #006633;">getId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// &lt; - Only Integers are allowed here.</span>
                    .<span style="color: #006633;">select</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;">list</span><span style="color: #009900;">&#40;</span>HibernateUtil.<span style="color: #006633;">getSessionFactory</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getCurrentSession</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;">&#125;</span></pre></div></div>

<p>
A toString on the above Query&lt;Person&gt; when passed an Address with id 2 would yield:
</p>
<pre>
FROM Person WHERE address.id = 2
</pre>
<p>
To implement this I used a few tricks:</p>
<ul>
<li>
Query&lt;T&gt; is an abstract class that uses <a href="http://gafter.blogspot.com/2006/12/super-type-tokens.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/gafter.blogspot.com');">Gafter&#8217;s Gadget</a> to obtain a Class&lt;T&gt; this is used to get the entity name that we are querying, and later to create an instance.
</li>
<li>
A <a href="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/reflect/Proxy.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/download.oracle.com');">Dynamic Proxy class</a> is created for this Class<T> and passed to the spec(T value) method.
</li>
<li>
This dynamic proxy records all calls made to it. If the call is to a method that returns another mockable object (e.g. getAddress() in the above example) then another recording-proxy is returned.
</li>
<li>
The query builder then uses the recorded method calls to determine which properties are being queried
</li>
<li>
The need to return a CompletedQuery interface forces the implementor to type a complete query or they will get a compile failure.
</li>
<li>
Interfaces represent the valid progressions at each step of the query building. e.g. after a where() you need to supply a comparison equalTo(), or like() etc. After a comparison you can complete the query or add another restriction with and();
</li>
</ul>
<p>Here is the example implementation of Query<T> that enables this. <a href="http://files.benjiweber.co.uk/TypeSafeHibernate.tar.gz" >Full demo code here</a>
</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;">uk.co.benjiweber.typesafehibernate.typesafe</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;">java.lang.reflect.ParameterizedType</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.lang.reflect.Type</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.List</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>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.hibernate.Session</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.springframework.util.StringUtils</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> Query<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> Type type<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> Recorder<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> recorder<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> StringBuilder queryBuilder <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> StringBuilder<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> Query<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        Type superclass <span style="color: #339933;">=</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: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">type</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>ParameterizedType<span style="color: #009900;">&#41;</span> superclass<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>0<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">queryBuilder</span>.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;FROM &quot;</span> <span style="color: #339933;">+</span> getParamClass<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getSimpleName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        recorder <span style="color: #339933;">=</span> createMockInstance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        spec<span style="color: #009900;">&#40;</span>recorder.<span style="color: #006633;">getObject</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;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> CompletedQuery spec<span style="color: #009900;">&#40;</span>T entity<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;">interface</span> CompletedQuery <span style="color: #009900;">&#123;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #339933;">&lt;</span>U<span style="color: #339933;">&gt;</span> Comparison<span style="color: #339933;">&lt;</span>U<span style="color: #339933;">&gt;</span> where<span style="color: #009900;">&#40;</span>U ignore<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        queryBuilder.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot; WHERE &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> comparison<span style="color: #009900;">&#40;</span>ignore<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;">private</span> <span style="color: #339933;">&lt;</span>U<span style="color: #339933;">&gt;</span> Comparison<span style="color: #339933;">&lt;</span>U<span style="color: #339933;">&gt;</span> comparison<span style="color: #009900;">&#40;</span>U ignore<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> Comparison<span style="color: #339933;">&lt;</span>U<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>  <span style="color: #009900;">&#123;</span>
&nbsp;
            <span style="color: #000000; font-weight: bold;">public</span> QueryOptions equalTo<span style="color: #009900;">&#40;</span>U value<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">return</span> comparison<span style="color: #009900;">&#40;</span>value, <span style="color: #0000ff;">&quot;=&quot;</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> QueryOptions notEqualTo<span style="color: #009900;">&#40;</span>U value<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">return</span> comparison<span style="color: #009900;">&#40;</span>value, <span style="color: #0000ff;">&quot;!=&quot;</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> QueryOptions like<span style="color: #009900;">&#40;</span>U value<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">return</span> comparison<span style="color: #009900;">&#40;</span>value, <span style="color: #0000ff;">&quot;LIKE&quot;</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;">private</span> QueryOptions comparison<span style="color: #009900;">&#40;</span>U value, <span style="color: #003399;">String</span> operator<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000066; font-weight: bold;">boolean</span> quote <span style="color: #339933;">=</span> value <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #003399;">String</span>.<span style="color: #000000; font-weight: bold;">class</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>value.<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>
&nbsp;
                queryBuilder.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>recorder.<span style="color: #006633;">getCurrentPropertyName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot; &quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>operator<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot; &quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>quote <span style="color: #339933;">?</span> <span style="color: #0000ff;">&quot;'&quot;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>value<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>quote <span style="color: #339933;">?</span> <span style="color: #0000ff;">&quot;'&quot;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> AbstractQueryOptions<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>  <span style="color: #009900;">&#123;</span>
&nbsp;
                    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #339933;">&lt;</span>V<span style="color: #339933;">&gt;</span> Comparison<span style="color: #339933;">&lt;</span>V<span style="color: #339933;">&gt;</span> and<span style="color: #009900;">&#40;</span>V o<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #000000; font-weight: bold;">return</span> Query.<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">and</span><span style="color: #009900;">&#40;</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><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <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;">private</span> <span style="color: #339933;">&lt;</span>U<span style="color: #339933;">&gt;</span> Comparison<span style="color: #339933;">&lt;</span>U<span style="color: #339933;">&gt;</span> and<span style="color: #009900;">&#40;</span>U ignore<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        queryBuilder.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot; AND &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> comparison<span style="color: #009900;">&#40;</span>ignore<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> Comparison<span style="color: #339933;">&lt;</span>U<span style="color: #339933;">&gt;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        QueryOptions equalTo<span style="color: #009900;">&#40;</span>U value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        QueryOptions notEqualTo<span style="color: #009900;">&#40;</span>U value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        QueryOptions like<span style="color: #009900;">&#40;</span>U value<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;">abstract</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">class</span> AbstractQueryOptions <span style="color: #000000; font-weight: bold;">implements</span> QueryOptions <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">public</span> CompletedQuery select<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> CompletedQuery<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: #339933;">;</span>
        <span style="color: #009900;">&#125;</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> QueryOptions <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #339933;">&lt;</span>V<span style="color: #339933;">&gt;</span> Comparison<span style="color: #339933;">&lt;</span>V<span style="color: #339933;">&gt;</span> and<span style="color: #009900;">&#40;</span>V o<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        CompletedQuery select<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;">private</span> Recorder<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> createMockInstance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        Class<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> cls <span style="color: #339933;">=</span> getParamClass<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;">return</span> RecordingObject.<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: #000000; font-weight: bold;">private</span> Class<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> getParamClass<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> type <span style="color: #000000; font-weight: bold;">instanceof</span> Class<span style="color: #339933;">&lt;?&gt;</span>
                <span style="color: #339933;">?</span> <span style="color: #009900;">&#40;</span>Class<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#41;</span> type
                <span style="color: #339933;">:</span> <span style="color: #009900;">&#40;</span>Class<span style="color: #339933;">&lt;</span>T<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> type<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getRawType</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
    @Override
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> toString<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> queryBuilder.<span style="color: #006633;">toString</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> List<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> list<span style="color: #009900;">&#40;</span>Session session<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> session.<span style="color: #006633;">createQuery</span><span style="color: #009900;">&#40;</span>toString<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">list</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>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Recorder<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> T t<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> RecordingObject recorder<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> Recorder<span style="color: #009900;">&#40;</span>T t, RecordingObject recorder<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">t</span> <span style="color: #339933;">=</span> t<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">recorder</span> <span style="color: #339933;">=</span> recorder<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;">String</span> getCurrentPropertyName<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> recorder.<span style="color: #006633;">getCurrentPropertyName</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> T getObject<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> t<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> RecordingObject <span style="color: #000000; font-weight: bold;">implements</span> MethodInterceptor <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> currentPropertyName <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> Recorder<span style="color: #339933;">&lt;?&gt;</span> currentMock <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</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> Recorder<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> 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>
        <span style="color: #000000; font-weight: bold;">final</span> RecordingObject recordingObject <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RecordingObject<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        enhancer.<span style="color: #006633;">setCallback</span><span style="color: #009900;">&#40;</span>recordingObject<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> Recorder<span style="color: #009900;">&#40;</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>, recordingObject<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;">if</span> <span style="color: #009900;">&#40;</span>method.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;getCurrentPropertyName&quot;</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> getCurrentPropertyName<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        currentPropertyName <span style="color: #339933;">=</span> StringUtils.<span style="color: #006633;">uncapitalize</span><span style="color: #009900;">&#40;</span>method.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">replaceAll</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;^get&quot;</span>, <span style="color: #0000ff;">&quot;&quot;</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;">try</span> <span style="color: #009900;">&#123;</span>
            currentMock <span style="color: #339933;">=</span> create<span style="color: #009900;">&#40;</span>method.<span style="color: #006633;">getReturnType</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: #666666; font-style: italic;">//method.invoke(o, os);</span>
            <span style="color: #000000; font-weight: bold;">return</span> currentMock.<span style="color: #006633;">getObject</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;">IllegalArgumentException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">//non-mockable</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>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getCurrentPropertyName<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> currentPropertyName <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>currentMock <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">?</span> <span style="color: #0000ff;">&quot;&quot;</span> <span style="color: #339933;">:</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;.&quot;</span> <span style="color: #339933;">+</span> currentMock.<span style="color: #006633;">getCurrentPropertyName</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: #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/2011/05/20/typesafe-hibernate-pojo-queries-without-code-generation/feed/</wfw:commentRss>
		<slash:comments>2229</slash:comments>
		</item>
		<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>3479</slash:comments>
		</item>
	</channel>
</rss>

