I was on my way back from vacation yesterday, driving down Route 95 South, when suddenly it hit me: Why not just call Java methods directly from the ColdFusion objects we use? Let's look at string manipulation, since it is a large part of programming. In the past, if I wanted to create a Java String object from a ColdFusion String object, I would instantiate a new Java String object:

  • <cfset jstrText = CreateObject(
  • "java",
  • "java.lang.String"
  • ).Init(
  • strText
  • ) />

This would take the ColdFusion string "strText" and use it to construct a new Java String object "jstrText". But, what I realized on the road was that the ColdFusion object ALREADY IS a Java String object. The Java String object exists - there is no need to create a new one. What's not obvious is that those Java methods are available from the ColdFusion String object.

One of the big reasons I like Java String objects is that their Regular Expression replaces are MUCH faster than that of ColdFusion. So, let's take this text for example. I am going to build a ColdFusion string:

  • <!--- Save text in a buffer variable. --->
  • <cfsavecontent variable="strText">
  •  
  • As Anna stepped out of the water into the
  • cool light of the moon, I could just make out
  • curves of her hip through the wet threads of
  • her summer dress.
  •  
  • </cfsavecontent>

Now, you can run regular expression replaces the ColdFusion way:

  • <cfset strResult = REReplace(
  • strText,
  • "([a-z]{1,3})",
  • "{\1}",
  • "ALL"
  • ) />

BUT, you can also call the Java methods directly as well:

  • <cfset jstrResult = strText.ReplaceAll(
  • "([a-z]{1,3})",
  • "{$1}"
  • ) />

How cool is that? I'll tell you: wicked cool! Not only that, the Java String::ReplaceAll() method is faster than the ColdFusion REReplace() method. And, we didn't incur the overhead of instantiating a new Java String object to work with the regular expressions. Again, wicked cool!