Hi Andrea:
StringBuilder is supposed to be slightly faster (and non threadsafe); but it is
murder on readability.
I used a java 5 trick in some GeoTools code that I am starting to be very fond
of. Using the Object... param syntax to hide the concatenation.
If we were add such a method to LOGGER the the example would be:
LOGGER.fine( "Got empty intersection for granule ", this, " with request ",
request );
Jody
On 02/07/2010, at 8:38 PM, Andrea Aime wrote:
> Hi,
> I'm looking at Daniele's last commit and wondering if it's
> really an improvement as stated in the commit log
> (Improved loggings using StringBuilder appends instead of String
> chaining). Here is the patch:
>
> - if (LOGGER.isLoggable(java.util.logging.Level.FINE))
> - LOGGER.fine("Got empty intersection for
> granule "+this.toString()+ " with request "+request.toString());
> + if (LOGGER.isLoggable(java.util.logging.Level.FINE)){
> + LOGGER.fine(new StringBuilder("Got empty
> intersection for granule ").append(this.toString())
> + .append(" with request
> ").append(request.toString()).append(" Resulting in no granule loaded:
> Empty result").toString());
> + }
>
> Ok, hard to read pasted like that, but you get the idea, instead
> of concatenating together multiple string an inline StringBuilder
> is used.
>
> This certainly makes the code harder to read. Does it make it
> faster, more scalable?
>
> As far as I know, it does not, the version concatenating strings
> is actually exactly the same as the one using StringBuilder once
> compiled. From the java.lang.String javadoc:
>
> ----------------------------------------------------------------
>
> The Java language provides special support for the string concatenation
> operator ( + ), and for conversion of other objects to strings. String
> concatenation is implemented through the StringBuilder(or StringBuffer)
> class and its append method. String conversions are implemented through
> the method toString, defined by Object and inherited by all classes in
> Java. For additional information on string concatenation and conversion,
> see Gosling, Joy, and Steele, The Java Language Specification.
>
> ----------------------------------------------------------------
>
> To prove it's actually just counter productive to use explicit
> StringBuilders for direct concatenation (as opposed to string
> building in a loop or over more lines of code)
> I wrote this little java code:
>
>
> public class Concatenate {
> public static void main(String[] args) {
> String s1 = "abc " + Math.random() + " def";
>
> String s2 = new
> StringBuilder("abc").append(Math.random()).append("def").toString();
> }
> }
>
>
> and then went on the command line and got a disassembly of the generated
> bytecode using javap, here we go:
>
>
>
> Compiled from "Concatenate.java"
> public class Concatenate extends java.lang.Object{
> public Concatenate();
> Code:
> 0: aload_0
> 1: invokespecial #8; //Method java/lang/Object."<init>":()V
> 4: return
>
> public static void main(java.lang.String[]);
> Code:
> 0: new #16; //class java/lang/StringBuilder
> 3: dup
> 4: ldc #18; //String abc
> 6: invokespecial #20; //Method
> java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
> 9: invokestatic #23; //Method java/lang/Math.random:()D
> 12: invokevirtual #29; //Method
> java/lang/StringBuilder.append:(D)Ljava/lang/StringBuilder;
> 15: ldc #33; //String def
> 17: invokevirtual #35; //Method
> java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
> 20: invokevirtual #38; //Method
> java/lang/StringBuilder.toString:()Ljava/lang/String;
> 23: astore_1
> 24: new #16; //class java/lang/StringBuilder
> 27: dup
> 28: ldc #42; //String abc
> 30: invokespecial #20; //Method
> java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
> 33: invokestatic #23; //Method java/lang/Math.random:()D
> 36: invokevirtual #29; //Method
> java/lang/StringBuilder.append:(D)Ljava/lang/StringBuilder;
> 39: ldc #44; //String def
> 41: invokevirtual #35; //Method
> java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
> 44: invokevirtual #38; //Method
> java/lang/StringBuilder.toString:()Ljava/lang/String;
> 47: astore_2
> 48: return
>
> }
>
>
> Can anybody see a difference between the first and the second
> calculation?
> If there is actually none, please, let's favor readability.
>
> Cheers
> Andrea
>
> --
> Andrea Aime
> OpenGeo - http://opengeo.org
> Expert service straight from the developers.
>
> ------------------------------------------------------------------------------
> This SF.net email is sponsored by Sprint
> What will you do first with EVO, the first 4G phone?
> Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
> _______________________________________________
> Geotools-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/geotools-devel
------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
Geotools-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-devel