<?xml version="1.0" encoding="UTF-8" standalone="yes"?><oembed><version><![CDATA[1.0]]></version><provider_name><![CDATA[Software is Crap]]></provider_name><provider_url><![CDATA[https://davmac.wordpress.com]]></provider_url><author_name><![CDATA[davmac]]></author_name><author_url><![CDATA[https://davmac.wordpress.com/author/davmac/]]></author_url><title><![CDATA[The &#8220;J&#8221; in &#8220;AJAX&#8221; should have stood for &#8220;Java&#8221;]]></title><type><![CDATA[link]]></type><html><![CDATA[<p>Java&#8230; more of a standard than a piece of software, I guess, but let&#8217;s attack it anyway. The only question, as is often the case, is where to begin&#8230; and I&#8217;ll constrain myself by not even mentioning Swing (oops, too late).</p>
<p>First, there is the  abysmal lack of support for real world file system handling. Like symbolic links, and unix permissions (Is this really coming in Java 7? about time).</p>
<p>Second, the incomplete support for asynchronous operations (<em>any</em> operation which blocks should be interruptible).</p>
<p>Third, and this one will be contentious, &#8220;equals&#8221; and &#8220;hashCode&#8221; should not be instance members. You should pass in a functor object which performs those operations to collection classes which need them (that&#8217;s not to say there might not be one or more default implementations of these functors).</p>
<p>Fourth, the collections library is incomplete. Why aren&#8217;t there utility classes such as JointSet (provides a set interface, backed by two or more real sets)?</p>
<p>Fifth, every object can be synchronized() on. Which means that every single object has a mutex hiding in it &#8211; which is a waste.</p>
<p>Sixth, it&#8217;s not possible to create a real Java sandbox from within a Java program, which is quite ironic seeing as this is really what Java was developed for (If you want to run some untrusted code, you can set a security manager, sure; but you can&#8217;t force a thread to stop running once you have started it. Even the deprecated Thread.stop() method won&#8217;t always work). There should be a safe way to stop threads (even if it means restricting what those threads can access/do), and you should really be able to intercept file and gui calls and handle them in any way you want (it shouldn&#8217;t just be limited to allowing or disallowing the operation).</p>
<p>Seventh, stupid version numbers. Java 5 &#8211; wtf? Java SE 6? Whoever came up with these names &amp; numbers should be reprimanded!</p>
<p>Ah well, I guess that&#8217;s enough. For now anyway&#8230;</p>
]]></html></oembed>