1. Run on Multiple Platforms from the Smallest Devices to the Largest Mainframes.
Run on multiple platforms, from smart cards, embedded devices(JStamp), cell phones(Nokia, Motorola, Ericsson etc), pdas (Palm, Symbian, Sharp),laptops and desktops (MacOS, Linux), servers (Unix based), Non Stop Servers (Tandem) to Mainframes ( IBM ).
2. Run Dynamic Languages
Run Dynamic Languages like Python (JPython) , Scheme (JScheme, SISC, Kawa), Ruby(JRuby), Smalltalk(Bistro). In comparison a commercial development effort to port Python to .NET showed dismal performance. Furthermore, a paper comparing the CLR and the JVM came to similar conclusions .
3. Compile in One Platform Run in Another.
Visual Studio.NET and .NET SDK End User License Agreements specifically states that code compiled with it cannot run in non-microsoft platforms.
4. Smaller Runtime Download
The Java Runtime Evironment (JRE) is a 8MB runtime download, .NET runtime download is over twice as large (i.e. 20 MB).
5. No mandatory upgrades. No subscription fees. No software insurance fees.
How many MIS organizations are held hostage to microsoft’s draconian licensing policies?
6. Run Multiple Versions of the VM (Runtime) on the Same Machine
Its common to have multiple version of the Java Virtual Machine (JVM) available and running simultaneously on the same operating system. This is useful if you need to test your application on different version of the JVM. Try doing this with .NET.
Its common for Windows based products to have several machines with different versions of Windows to do tests. In fact, this is in fact such a big problem that even Microsoft licensed the use of VMWare (a product that allows you to run multiple virtual machines) for its 6,000 salespeople .
7. Large Innovative Open Source Community
The existence of a large body of open source code is value that should not be ignored. This provides developers an enormous repository of code that can be reused. In fact, most .NET open source projects are rewrites of Java projects.
8. Low cost Commercial Quality IDE’s
The Eclipse and Netbeans IDEs are free for any kind of software development. JBuilder and JDeveloper are free for educational use. This is in stark contrast with .NET where Visual Studio.NET costs almost $500. Also, if you think sharpdevelop is commercial grade, think again!
9. More Available Jobs
A search on Monster.com will quickly reveal that there are 10 times more jobs that require Java skill than C# jobs. In fact a third of C# jobs require Java skills.
10. Better and Standardized Connectivity to Legacy Applications
The Java Connector Architecture (JCA) is a standard for connecting to Enterprise Information Systems (EIS). JCA supports access to SAP, IBM CICS, PeopleSoft, Oracle, Siebel, Screens 3270, AS/400, Unisys, ADABAS-C, VSAM, Codasyl, IMS, Tuxedo etc. This level of connectivity options in unavailable for .NET.
11. Multiple Vendor Choice and Support
Java technologies are supported by multiple vendors allowing mix and match and best of breed solutions. Java standard APIs have always been designed to be supported by multiple implementations.
For example the Java Messaging Service (JMS) standard is supported by multiple vendors IBM, TibCo, Progress, SpiritSoft, Fiorina, Swift, Open3, JBoss, etc. You have the freedom to pick what’s the best messaging product for your situation, you don’t have that option with Microsoft where there is only one choice MSMQ.
12. Compile to Machine Code
Java has several solutions to compiling into machine code, that is when compiling to byte code is an issue for either intellectual property or performance reasons. TowerJ, Jove from Instantiations, Excelsior JET and GNU GCC provide robust solutions to compiling Java to native code.
13. Future Proof
Java is future proof or rather future portable, in the sense that your existing code base will not become obsolete. How so? I can run Java on machines today and machines in the future. You don’t have that assurance for Microsoft’s technologies like .NET. A vivid example is their support for for VB6, which has been set to expire. It’s crucial to consider that every development has a ROI that spans several years. How many years was DNA around before Microsoft declared it obsolete?
14. Most Popular Language in the Corporation
A recent survey reveals “Interestingly, the strong showing of Visual C# .NET divides the Microsoft camp and propels Java into first place as the most popular language over the coming year”. In corporations, there are more developers familiar with Java than any other language. The benefit is that there’s a higher chance that someone can maintain or fix a java program than that written in any other language. Do you think you’ll find someone in your corporation who will be able to fix that legacy VB application 2 years from now?
15. Larger Talent Pool
Java is taught in most universities, this is resource for well trained affordable junior programmers, the same can’t be said about C# or VB. Senior Java developers are also easier to find. The same can’t be said about C# where there aren’t any senior developers. Also a senior VB developer is least qualified to lead development requiring OO analysis and design.
16. More Contributions From R&D Organizations
Java is not only taught at universities, it is also extensively used as part of research and development. Work by Matt Welsh at UC Berkeley contributed to the New IO mechanisms we find in JDK 1.4. Generics was worked done by University of South Australia. Aside from universities, research organizations like CERN and HEP have contributed a large amount of code to the public.
17. Government Approved
The Office of Management and Budget (OMB) of the U.S. Federal Government recommends to architects the use Java 2 Enterprise Edition over Microsoft .Net as underlying technology. This means that a larger share of billions of dollars that will be spent to upgrade the governments aging IT infrastucture will be done in Java. Expect other governments wary of Microsoft’s licensing practices to do the same.
18. More Homogeneous and Less Complex Environment
The Java environment is more homogeneous and less complex than .NET. It is not littered with obsolete technologies like COM, DCOM, COM+, ADO, nor is it dependent on operating system indiosyncracies like register settings or most recent service patch level. Furthermore, there is no artificial divisions between someone called a VB programmer and someone called a C# or C++ programmer. Developers are competent whether its UI development or server development, everything is in Java so its understandable and therefore maintainable by everyone.
19. More Deployment Options
With Java there are more ways to deploy your application. Here are a few ways: applets, webstart, x-windows, midlet. Furthermore, there is standardization for client provisioning being proposed as a JSR.
20. More Searchable References
A search in Google of for “C#” hits 1,720,000 documents, for “Visual Basic” hits 3,270,000. In comparison a search for Java hits 32,100,000, almost 10 times more than even Visual Basic.
21. Better support for Software Process Best Practices
Most best practices in software development are done in Java shops. Examples like Refactoring, JUnit testing and Continuous builds. Java developers are familiar with these practices, and by hiring them, you introduce these practices into your organization.
22. Mature Object Oriented Relational Mapping Tools
It is best practice in Object Oriented development to decouple business objects from their underlying relational database representation. Java has several mature and robust products that support the mapping of relational databases to objects, notable of which are TopLink and CocoBase. There is no equivalent of such a tool in the .NET world. Microsoft is trying to remedy the situation by buiding something called “ObjectSpaces”, however its still in beta and not mature enough to entrust your enterprise business on.
23. More Productive Coding Tools
Java IDEs are superior in their support for coding tasks. Features like code refactoring, intention actions, superior code browsing (i.e Find Usages) and robust code completion are superior to what you find in Visual Studio.NET. In fact, Visual Studio.NET is known to unintentionally erase code.
24. Cross Platform Integration with Other Languages
Integration with Java from other languages like Perl, PHP or Python is cross platform. In otherwords, I can take my PHP scripts that talk to Java and run in windows, place them in a Linux box and have them work without a major porting effort.
25. Higher Paying Jobs
On the average a Java programmer earns quantitatively more than a VB programmer with the same number of years experience.
26. Better Support for Peer to Peer Networks
Java is used extensively to build Peer to Peer (P2P) networks. There are open source java implementations of the gnutella protocol. JXTA is an emerging standard for P2P networks and uses Java as its prototype implementations. Limewire and Kazaa downloaded hundreds of millions of times are written in Java and are among the more popular P2P clients available to date.
27. Pure Java Relational Databases
There are several relational databases that are implemented in Java, these are Pointbase, HSQL, Instantdb, Firstsql and Cloudbase. These are important in that they allow you to deploy a database everywhere you can deploy Java. Some of them even allow Java types to be used in the database. Another additional benefit they are much easier to install than a traditional RDMS. There are no equivalents of an RDMS written in .NET languages like C# or VB.NET.
Java has a standard way of providing Authentication and Authorization (JSSE). The choices in .NET is limited. In fact, a well published bug in the way IE handled digital certificates required a service pack to fix.
29. Safer Third Party Libraries
Java libraries are assumed to be 100% pure Java unless otherwise noted. .NET libraries may come in native code or IL. Native code libraries have a likelihood to make a software system unstable and insecure. In fact its not clear what percentage of code in the core .NET libraries compile to MSIL. In the .NET world the concept of safe library code is deliberately ambiguous. Rather than tell you that Windows.Forms is 90% native windows code, Microsoft prefers to be silent about it, and hope that you buy their portable and safe argument.
30. Resusable IDE Frameworks
Netbeans and Eclipse are reusable GUI Frameworks that can be leveraged in building your GUI application. This means less time building your GUI framework, and more time building the core of your application. You can’t find something similar in .NET.
31. Open Source Structured Diagram Editing Frameworks
There are many open source structured diagram editing frameworks in Java (i.e. GEF, JGraph, JHotDraw) that can be reused and embedded in your application without cost.
32. More Parser Generators
There’s is more mature support for generating parsers in the Java world, some options are JavaCC, ANTLR, Sable, JavaCUP and JFLex.
33. Aspect Oriented Programming
Grady Booch co-creator of UML states “If I were to look into my crystal ball in terms of the next generation of programming languages, my guess is it would be an aspect-oriented language, and my further guess is the UML itself could be a reasonable aspect-oriented language.” AspectJ is a compiler that supports aspect oriented programming (AOP), it has been available for Java for several years. There is no equivalent to AOP in the .NET world, some may say that .NET attributes are the same, however that is an oversimplification.
34. Model-2 Architecture
Model2 architecture promotes separation business logic and presentation logic. This leads to a more reusable and maintainable web applications. Such a concept is competely foreign to .NET.
35. Web Servers written in 100% pure Java and Open Source
Webservers like Tomcat, Jetty, Resin and Orion are written in Java unlike IIS which is written in something other than a .NET language. The benefit is that customizations and extensions are easier.
36. Microkernels and Services Frameworks
Many of the servers developed in Java are based on a JMX microkernel architecture. This means easier configurability, manageability and ultimately lower total cost of ownership (i.e. TOC), something completely absent in .NET.
37. Application Servers
Application servers help develop highly scalable implementations, the concept of an application server is missing in .NET, the equivalent however may be .NET server however its release has been delayed 3 times and its anybody’s guess when it’ll come out. Hopefully it gets released before your “Software Assurance” expires.
38. Tag Libraries
Tag Libraries are standard and safe way of encapsulating code for use by Web designers, unlike ASP.NET where it is common practice to intermingle code with HTML.
39. More Embedded Expression Languages
There are several expression languages that you can use to make programming easier. The most familar to most is support for regular expressions and support for XPath queries. However, the Java world has JXPath which supports xpath like queries across plain old java objects.
40. Pure Java Script Languages and Embedding
41. More Web Service Deployments
A recent survey shows that 53.3% of webservices implementations are done on J2EE as compared to a dismal 33.7% on the .NET platform. This given the fact that .NET is supposed to be a platform designed and tuned for webservices.
42, Sophisticated Logging via Log4J
Log4J is a sophisticated logging library available for Java that has no parallel in .NET.
43. Distributed Caching
There are multiple vendors and open source projects that provide distributed caching (i.e. SpiritCache, Coherence, Gemstone, JCS, Oracle). Distributed Caching solutions are unavailable in .NET. In fact “Centralized Caching” for .NET is in one site’s wishlist.
44. More Alternative Messaging Implementations
There are more messaging implementations that are supported in Java, furthermore, they are supported by a standard API (i.e. JMS). What this means is that you can choose the best messaging product for your situation. For example, Tibco is used for high demand financial markets, iBus supports wireless environments, Sonic can bridge Mail and FTP messaging. With .NET you only have one choice, however, there are JMS vendors that can also bridge to .NET.
45. Write Stored Procedures and Embedded SQL in Java
You can write Stored Procedures in Java for Oracle, DB2 and Sybase to name a few. Java has a standard way of embedding SQL called SQLJ, which is supported by Oracle, DB2, Sybase and Informix . In the .NET environment you write a stored procedure using TSQL, which doesn’t look anything like C# or VB.NET!
46. Better support for Lightweight Persistence
There are serveral lightweight high performance persistence libraries written for Java, some examples are NDBM, Jisp and JDataStore. This is useful when your application does not need to bundle a full fledged relational or object database. You cannot find a similar lightweight persistence library that’s written in C# or VB.NET.
47. Open Source Java Compilers and Parsers
There are several open source java compilers, many written also in java (i.e. Jikes, Eclipse, AspectJ, Kopi, Kiev) that make it easier to develop tools like Auditors, Metrics, Code Coverage and Refactoring. Furthermore, it makes is easier to develop embedded languages like SQLJ.
By contrast .NET’s CodeDOM assembly isn’t able to parse .NET languages like C# or VB. It can only generate code, however what real gain is that, when writing out strings will suffice?
48. Hardware Support
There are multiple vendors that have hardware support for Java in their microprocessors, the most notable of which is ARM which holds a commanding position in PDAs and Cell Phones. The ARM Jazelle technology provides a highly-optimized implementation of the Java Virtual Machine (JVM), speeding up execution times and providing consumers with an enriched user experience on their mobile devices. (http://www.arm.com/armtech/jazelle?OpenDocument). Other vendors include Nazomi and AJile.
49. More Licensing and Support Options
Because there are more vendors supporting Java, you have a choice of which licensing scheme fits your business model. One good example are the licensing schemes available for Application Servers. Oracle has per user licensing, IBM and BEA have per server licensing, Macromedia has a scheme to support embedding, JBOSS has a free license with support that can be licensed. In contrast, .NET Server will only be per user licensing.
50. Support for Embedded Devices
Can you develop with .NET on an embedded device like JStamp?
51. Continuous Build Frameworks
Java has several frameworks to support a countinuous build process. The frameworks manage builds, documentation, source metrics, testing, code coverage, source cross-references, email notification and more. These frameworks give teams a automated and continuously updated snapshot of the overall state of development. Examples of these frameworks are Maven, Forrest, Centipede, AntHil and Cruise Control. There are no equivalents of these frameworks in the .NET environment.
52. Open Community Process
The Java Community Process (JCP) is gives vendors, organizations and individuals a forum to contribute to Java’s future development. How does one contribute a new API to the .NET framework? Unless you’re a Microsoft employee the process isn’t available to you.
53. Faster Virtual Machines
A recent study of “Method Devirtualization and Inlining” leads to this conclusion: “The benchmark reveals clearly that the CLR lacks any devirtualization; its performance is just a little superior to HotSpot Client 1.3.1; significantly inferior to JET, and very inferior to IBM and HotSpot.”
54. No Rebooting on Upgrades
Service Pack upgrades require reboots, adding a library that’s dependent on an unmanaged DLL requires reboots. A server pack upgarde can require over 30 minutes to install. With Java an upgrade of the entire virtual machine does not require a reboot of the operating system. Furthermore, webstart has excellent facilities for managing the upgrades of the VM.
55. Multiple Pluggable Cryptographic Providers
The Java Cryptography Extension (JCE) defines a standard way of seamlessly plugging in different cryptographic services and algorithms in Java. There are multiple vendors RSA, Baltimore, Entrust, Cryptix, Phaos, BouncyCastle, Wedgetail see http://www.itworld.com/nl/java_sec/06222001/
56. Better Collection Classes
The Java Collections Frameworks is simply better than .NET. .NET’s System.Collections namespace doesn’t even have a Set and its corresponding operators union, interesection and difference. Makes one wonder if the person who designed this has a degree in Computer Science.
Also there are also more extensions available for the Java Collections Framework. Examples are Jakarta Collections, JGL, Trove and PCJ , many more can be found at http://www.javacollections.org.
57. More High Performance Database Drivers
There are more high performance database drivers that support the JDBC standard as compared to ADO.NET. In fact ADO.NET doesn’t have high performance drivers for DB2/Informix or Sybase, these vendors alone corner nearly half of the database market.
58. More Literature
There are more books published for Java than C# or other .NET languages. Furthermore, there are more books that cover advanced topics, most .NET languages books tend to be beginner books. There are many seminal books that are important to read by any learned developer, examples are “Concurrent Programming”, “Refactoring”, “Pattern Languages of Program Design” and “Server Component Patterns”, “Agile Software Development”, “Test Driven Development” and “Core J2EE Patterns”, these all require an understanding of Java. (note: You can support this list by purchasing any of these books via the links above, thanks!)
59. Free Tools for Checking Coding Standards
There are many free and open source tools that check coding conventions in Java. Examples are Checkstyle, PMD , JCSC and JLint.
60. Tools to Support Design By Contract
Design By Contract is a mechanism introduced by the Eiffel language to support more robust software development. There are several free tools in the Java world that support this methodology. Examples are: iContract, JMSAssert, jContractor and Jass.
61. Public API’s are Public Domain
Java Technology Restrictions. You may not modify the Java Platform Interface (“JPI”, identified as classes contained within the “java” package or any subpackages of the “java” package), by creating additional classes within the JPI or otherwise causing the addition to or modification of the classes in the JPI. In the event that you create an additional class and associated API(s) which (i) extends the functionality of the Java platform, and (ii) is exposed to third party software developers for the purpose of developing additional software which invokes such additional API, you must promptly publish broadly an accurate specification for such API for free use by all developers.
.NET doesn’t have an equivalent guarrantee.
62.More Garbage Collections Options
Generational Stop ‘n Copy
Single Spaced Concurrent
Concurrent Mark and Sweep
63. More Languages for the VM
There are more languages written for the Java VM than the .NET CLR. See Languages of the Java VM (http://grunge.cs.tu-berlin.de/~tolk/vmlanguages.html) for a listing. A piece “One Runtime to Bind Them All” (http://www.javalobby.org/clr.html) exposes the myth of .NET’s common language support. Meanwhile, the number of new languages for .NET have remained stagnant since its release a year ago, in fact the only new language since then was J#.
64. Better Exception Handling
There is no analog to the throws clause in method signatures. One major side effect of this is that unless the creator of the API explicitly documents the exceptions thrown then it is not possible for the users of the API to know what exceptions to handle. Thus users of C# are reliant on the documentation skill of programmers as their primary error handling mechanism which is a less than optimal situation.
.NET also does not have Checked Exceptions, the use the Compiler to flag any unhandled exception. This is an additional mechanism that developers can use to improve the robustness of their programs.
65 Better SOAP Interoperability
Recent results from http://www.soapbuilders.org/ interoperability lab indicate lingering problems with SOAP interoperability. Several java companies Cape Clear, Systinet and TheMindElectric have made extensive effort to make their products interoperate with a large set of SOAP products. Thus with Java there is a greater likelihood of acheiving SOAP interoperability than Microsoft. In fact, Microsoft has several SOAP toolkits that astonishingly enough aren’t 100% interoperable!
66. Predictable Upgrade Cycle
The planned release schedule between major versions of the JDK is 18 months. For C# its not clear, its even murkier for the ECMA standard. For example, the next version of C# will include generics, however it changes some details of the CLI which ultimately means the ECMA standard needs to be updated. The schedule when this will happen is not clear. Even worse, based on past experience, its not clear if Microsoft will continue to support today’s technologies (i.e. VB6, DNA).
67. Better Support for Domain Specific Languages
Extensible java parser frameworks like JSE, JacO, Polyglot aid in the creation of extensions to Java to make it easier to build domain specific languages. These frameworks allow a non compiler expert to easily create new language constructs.
68. Security in Java is Proven and Peer reviewed.
Java has proven itself for many years to be an extremely secure environment, unlike Microsoft where its typical to read about viruses and security alerts on a weekly basis.
Microsoft executives have even warned that releasing the source code for Windows would reveal even more security holes. In contrast. Java has been available in source code form for the peer review for years, yet you rarely hear about java security failures.
When was the last time you heard of a Java virus. Like never. That’s because Java was designed foremost with security in mind. What good is a platform that cannot guarantee the integrity of the system and in turn acts as a petrie dish for growing and ditributing viruses? Microsoft has a rich history of platform viruses – at last count in May of 2000 there were over 52,000+ Microsoft-related platform viruses, trojan horses and other security threats. In the article, Contagion : Why Our Dependency On Microsoft Makes Us Susceptible (http://www.oreillynet.com/pub/a/network/2000/05/22/security.html), one of the foremost experts on security, Gene Spafford, lists platforms and the numbers of threats in each – Microsoft is securely in first place – probably forever. More recently one of the key centerpieces of the .Net platform, the IIS server, was sited for its repeatedly bad security – and remarkably Gartner suggested that customers examine other solutions. (http://www.theregister.co.uk/content/4/21853.html)
69. Core API Source Code Availability
The source code for the Java runtime enviroment is availabe for everyone to examine. In contrast, its a violation of the EULA agreement to decompile for study the libraries of the .NET SDK.
Knowing how a particular API does its work is vitally important in any development environment.
70. Environmentally Friendly
.NET is dependent on MDAC 2.7 and IE6. That’s even if you don’t use any of these features, particularly IE6 on a server. Expect more of these dependencies with every server pack upgrade. Java is less dependendent on the intricacies of the current service pack.
71. Better Best Practices Blueprint Application
Microsoft was recently criticized by members of the .Net community for writing “Anti-Patterns” instead of adopting best practices. Meanwhile, Java vendors spend a lot of time on educating new programmers in best practices (see this site as an example).
72. Business Rule Engine Support
Rule-based systems are designed to encode business rules explicitly and in a declarative manner. The better manageability of business rules leads to a more agile business. Java has comprehensive support for Rule-based systems through vendors like ILOG, Blaze and ATG. Furthermore, there are open source Rule-based systems written in Java, in particular you have JESS, Drools and JEOPS.
73. Run on 64-bit Platforms
Java runs 64-bit platforms today, specifically on AIX, HPUX, Sun and Linux (Itanium). .NET by contrast doesn’t even run on the Itanium based Windows Server. Expect to see Java ported first to AMD’s 64bit Opteron processors [see].
74. Millions of Java Enabled Cell Phones Today
There are 75 million java enabled phones today by contrast anyone will be hard pressed to find a wireless phone that runs .NET compact framework (There’s probably one, but I heard it has virus problems!).
There are no more than “10 mobile carriers around the world deployed Java technology enabled devices with approximately 75 million handsets worldwide running on the Java platform. In addition, there are over 80 different handset models from 19 manufacturers worldwide using the J2ME platform.” [ Numbers as of September, see source http://www.sun.com/smi/Press/sunflash/2002-09/sunflash.20020924.2.html ] . Microsoft recently suffered a big setback when one of the few implementers of Microsoft wireless smart phone solution abandoned the the Microsoft solution for Nokia/Symbian/Java. Java has rapidly become a standard part of wireless devices.
75. Garbage Collect Classes
Java classes can are garbage collected, this is controlled by allowing the ClassLoader to be garbage collected. This is a technique used for building dynamic systems.
By contrast, generated MSIL cannot be unloaded. The only way to unload code is to unload an entire application domain (that is, to unload all of your application’s code.) [see].
Furthermore, there’s no way to add dynamic scripting to an application without the ability to unload a dynamically created assembly. Loading the assembly into another AppDomain causes severe speed issues, great difficulting with respect to marshalling and memory leaks.
76. Hard RealTime Support
A recent paper by IEEE reveals the inadequacy of the .NET Framework for realtime applications. It concludes with “…the .NET platform are not currently appropriate for hard real-time systems for several reasons. It has unbounded execution of its garbage-collected environment and lacks threading constructs to adequately support schedulability and determinism, among other things. Our experiments also showed that the thread inheritance didn?t work.”
In contrast Hard RealTime support for java is well studied and standardized [http://www.rtj.org/]. Furtheremore multiple implementations are available for RTOS.
77. Multiple Complete Implementations of the Virtual Machine
With Java there are actually multiple vendor implementations of the virtual machine on the same platform. There are two reasons for this that is not present in the .NET. The first is that you can license the Java from Sun and build your own compatible implementation, IBM, Oracle and TowerJ does this. The second reason is that there’s a mechanism for writing your own JIT compiler and plugging it in to a standard JVM, BEA does this. These options are clearly not present with .NET.
78. Sane Coding Conventions
.NET Coding Conventions border on the ridiculous. For example for C# Namespaces, Class, Methods, Properties, Enums, Public Fields all have the exact same convention. That is, you could write something like this A.B.C.D.E.F.G() and you couldn’t tell where the namespace part begins and ends, whether its a static call, or whether a method is called somewhere in between. In Java the same statement is much clearer, it’ll go like this a.b.c.D.getE().f.g() . Also the weirdest thing of all is, why do method names start with caps?
79. More Comprehensive XML Support
There are more XML libaries available for Java than .NET. For example there are more kinds of parser, that is there are Pull Parsers, Event Driven (i.e.SAX) and model based parsers. There are more XML model representations (i.e. DOM, JDOM, DOM4J, EXML, XOM) these also come with a way to create customized highly effecient in memory representations. There are more extensive schema tools like validators and converters (i.e. MSV and Jing). There are XML pipeline frameworks like Cocoon. Pure XML databases like Xindice and XIS. There are XML gui frameworks like Luxor, XWT. There are XML scripting like Jelly.
80. Dynamic Distributed Systems
Support for developing dynamic distributed systems is more comprehensive in Java. Java’s RMI has no equivalent in the .NET world, RMI is able to send messages where the class itself doesn’t exist in the receiving machine. In otherwords it is able to dynamically load the class as the message is sent, extemely convenient however unavailable for .NET. Java takes this even furher with JINI by introducing dynamic discovery of services, robust distributed garbage collection and transactions. Furthermore, there are other Java based dyanamic distributed systems like OpenWings, Cougaar, FIPA Agent Systems and Grid Based systems.
81. More Flexible and Powerful 2D Drawing
Java’s 2D drawing and imaging APIs are outstandingly designed. For example, support for new Image formats can easily be added without having to modify a single class in the core API. This is not the case with .NET’s System.Drawing api. The System.Drawing api is based on a thin wrapper over GDI+ and therefore not as well designed or portable as Java2D.
The Java2D api aside from being more flexible is more powerful being able to easily support the rendering requirements of SVG (see Batik). One reason may be that a lot of the Java2D code was contributed by Adobe the leader in drawing and imaging products. There are of course SVG projects based on .NET, however until now, they haven’t yet built one that passes all the conformance tests.
82. Better Designed GUI Frameworks
Java’s two leading GUI frameworks Swing and SWT are better designed than Windows.Forms. In fact both are designed with Java in mind and designed to be portable, unlike Windows.Forms where its a thin wrapper over a native library.
Swing and SWT use the MVC pattern extensively, separating model from presentation. Windows.Form however in many cases doesn’t. Controls such as TreeView, ListBox and ComboBox don’t separate model from presentation, thus it encourages developers to store data in their UI controls.
Also Swing is more powerful than Windows.Forms. For example, border styles can be plugged into any component using the strategy design pattern. In Windows Forms, components are responsible for supplying and drawing their own borders.
83. Create More Threads in Windows
JRockit is a JIT compiler that is able to create more threads than allowed by the operating system. This is important in that is allows for more scalable servers. JRockit has the concept of thin threads that allow several threads to be simulated by a single native thread, this leads to lighterweight context switching and scheduling. .NET on the otherhand is limited by the capabilities of Windows threading.
84. Unambiguous Definition
The definition of .NET is completely ambiguous. That is, Microsoft has chosen to use the term “.NET” for almost everything it produces. I’m now eagerly waiting for Microsoft to release Mouse.NET. (more MS Dumps .NET Tag and I’m Confused… ) In practical terms, there’s no easy way for a customer to determine if a product uses the CLR or not. So you just never know if you’re buying more legacy versus upgrading to a new framework.
Also, the search term “.NET” is an extremely poor term discriminator for search engines. Searching for “.NET” in Google shows one entry for Microsoft .NET within the top 40. The implications of this is that its just harder to find information about .NET.
85. No Anti Open Source Stance
The Microsoft EULA agreement casts doubt on the legality of creating GPL software using .NET. [see see]
Java ClassLoaders allow bytecode analysis and manipulation, a feature absent in .NET. This runtime transformations allow for innovative interception based techniques like dynamic aspect oriented frameworks, testing frameworks and instrumentation for manageability.
87. Dynamic Proxies
Java Dynamic Proxies type safe dynamic interception of method invocations. This is extremely useful in dynamically creating remote stubs rather than using a compilation approach. JBoss uses this mechanism to allow for a more productive development environment for EJBs. Dynamic Proxies have also been used in other ways like in AOP and Design By Contract implementations. Dynamic Proxies are absent in .NET
88. More Tools To Explore The Semantic Web
RDF, TopicMap and Ontology Tools written in Java are more available to researchers than .NET. In fact, are there any RDF or TopicMap tools written in a .NET language?
89. Better Support for Emerging International XML Standards
The Jigsaw HTTP server from W3C serves as a test bed for emerging W3C standards, it is written in Java. Other W3C XML standards that have java implementations include RDF, SVG, XML Query, and XForms.
Oasis is a consortium for developing XML standards for Business, the ebXML standards are jointly sponsored by UN/CEFACT, Microsoft is conspicously absent in this standards body. Also OASIS implementations tend to be done in Java, examples are RelaxNG, BTP and Sun’s JAXM. Furthermore, many oasis standards are also becoming ISO standards, an example is RelaxNG.
90. More Easily Portable Virtual Machine
Which Virtual Machine is more easily portable to a new machine? Hints to the answers can be found looking at the progress of two open source projects. Mono [ http://www.go-mono.com ] is a project that is porting .NET to Linux systems, IK.VM.NET [ http://radio.weblogs.com/0109845 ] is a project that is porting Java to .NET.
Mono started over one and a half years ago, and has a cadre of programmers and corporate funding. IK.VM.NET by contrast was started much later and is developed by a single person. In that time span, IK.VM.NET is able to run the Eclipse IDE inside .NET, in stark contrast, Mono is unable to run even the simplest of WinForms application.
The Java Virtual Machine and Java Libraries are designed to be portable, .NET libraries are
simply not portable.
91. No Evil Type Coercion
User defined implicit conversions allow a class to define conversions from another class without requiring a explicit cast or a call to a conversion function. This construct has been the source of numerous hard to track bugs, ever since in was introduced in C++ and VB [ http://archive.devx.com/premier/mgznarch/vbpj/1995/11nov95/progtech.pdf ], that it has been nicknamed the “Evil Type Conversion”. Java took the good parts of C++ and dropped the bad, in contrast C# has reintroduced this problematic construct. To read more about its faults see http://www.geocities.com/csharpfaq/implicit.html.
92. Concurrency Utilities
Dealing with concurrency is an extremely difficult task and should be left only to the most highly skilled of developers. Doug Lea has written an extensive library of utilities that addresses the complexity of dealing with concurrency. Aslo there are other similar packages written for Java (JHPC and JThreadKit). The JCP is also in the process of developing a specification [JSR-166] that is based on ideas of Doug Lea and others.
93. Parse XML Faster
A recent observation done comparing MSXML with a java based xml vendor: “I did another benchmark for fun tonite, parsing a small (12-line) XML file using Electric XML running on CLR (compiled using J#) versus the same file using the native microsoft XML parser MSXML. surprisingly enough, Electric XML was twice as fast in all of my simple tests, whether the parsers were called from J# or C#. the contents of the file was read just once into a string, and then the string was parsed 50,000 times to generate an accurate value. Electric XML parsed the string in 0.14 milliseconds, and MSXML parsed the string in 0.28 milliseconds. not a big deal, but an interesting result. Electric XML running on a JVM parses the same string in just 0.09 milliseconds. so EXML running on a JVM is three times faster than MSXML on a CLR, at least for small files. ”
94. Mature Platform
Java has proven itself in many large deployments over the years. “.NET is at version 1.0, the C# language is still evolving and there’s not enough real world use to evaluate.” -sosnoski
95. Open Source Multicasting Libraries
Java has a wealth of open source libraries that exploint the multicast capabilities of the network. There is the JavaGroups project that has been used by JBoss to provide clustering capabilites, Spread that provides high performance multicast and group communication, Reliable Multicast, Proactive that provides a comprehensive library for parallel, distributed and concurrent programming and Java Rendezvous that implements Apple’s Rendezvous [ftp://ftp.strangeberry.com/pub] dynamic IP protocol. A google search for “java multicast” reveals 116,000 entries, a search for “c# multicast” reveals 2,850 entries. I now wonder if there are any multicasting libraries for C#.
Ant started life as the build tool to replace Make. It is now used for tasks other than its original purpose, its used for running automated tests, building documentation, creating installations, configuration, execution of programs and more[http://ant.apache.org/manual/tasksoverview.html]. It also serves as the core of many continuous integration frameworks.
However, isn’t there a clone called NAnt for .NET? No, claiming that NAnt is a clone ignores that hundreds of extensions that have already been written for Ant. A look at NAnt task list shows 32 tasks. In contrast there are 72 core ant tasks, 52 optional tasks [http://nant.sourceforge.net/help/tasks/index.html], there are also http://ant.apache.org/external.html 38 tasks built by other parties.
What this means as a developer is that its much easier to find an Ant ant task to fit your special situation and this means you don’t have to code it yourself. Of course that means more time for the important tasks at hand, and therefore better productivity.
JUnit is a unit testing framework that serves as one of the cornerstones of agile and test-driven development.
The rebuttal again by the .NET community is going to be the same, isn’t NUnit available? Again, the answer is No. That’s again because the number of extensions [http://www.junit.org/news/extension/index.htm] for JUnit dwarfs what’s available for NUnit. The multiple extensions available for JUnit cover the different complexities in which software is deployed. For example there are extensions for GUI development, Web development, App server development, XML development, Small Device development. Furthermore, there are extension on different ways to perform testing like Mock Objects, Integration Testing and Load Testing, NAnt in contrast only gives you basic JUnit. In summary, if you want to use JUnit in anger, that is testing vigorously and comprehensively, then the tool of choice is obviously JUnit and its extensions.
Refactoring, another cornerstone of agile development. For the .NET audience who don’t understand what this means, get a primer at http://www.refactoring.com/ . Anyway, the refactoring support that’s available for Java is heads and shoulders above anything available to the .NET community. Some may argue that .NET has refactoring support, coming from some small company, well my retort is this, “have you ever tried it?”
What should one look for when evaluating a refactoring tool. For starters, it helps that it has a comprehensive list of refactorings, second it helps to know that the refactorings are not constrained, third how robust (i.e. correct) are the refactorings , and finally how easily can you revert from changes. Take a look now at IntelliJ or Eclipse evaluate them with the criteria above, now go take a look at what’s available in .NET. Come back when you’ve discovered the truth.
99. Better CVS Support
CVS, for the .NET audience that means Concurrent Versions System, not the pharmacy! Anyway, CVS is used throughout the open source world to version control software artifacts, CVS repositories are readily available on the public internet. I’m not going to debate if CVS is better than X, however I’m going to say that it’s affordable and allows for world wide collaboration.
Ant supports CVS, unlike NAnt, furthermore the Eclipse IDE is arguably the best client ever designed for working with CVS.
100. Eclipse Momentum
Eclipse, the open source IDE framework. Yes, it is the 100th entry. Why? I can go on trying to convince you that its the best thing invented since sliced bread, but I don’t think I could convince you.
However, what’s is strikingly clear and obvious is the momentum that it has generated. C# people keep claiming that C# has “momentum”, however if you want to see real “momentum” (actually velocity, more on this later) you have to see what’s happening at the grass roots level for the Eclipse community. To get a good graphic picture of what’s happening, go to sourceforge and search for “Eclipse”. You’ll find over 50 active projects building Eclipse plugins, there are even more not listed at sourceforge, you can find them here [http://eclipse-plugins.2y.net/eclipse/index.jsp]. No do the same for VS.NET, scower the web using the word “Addin” (that’s the VS.NET equivalent term), find anything? I guess not much right?
Consider then this, Eclipse 2.0 was released in June last year, when was VS.NET 1.0 released? People argue that this list isn’t fair because Java is older and therefore would have more support. Now, you have the argument the otherway, VS.NET 1.0 is older than Eclipse 2.0, so shouldn’t that mean it should have more support?