Selon Christian Stein <[EMAIL PROTECTED]>:

> > - Format methods taking 1 or 2 arguments now delegate to the format method
> >   that takes in an array argument. This results in smaller code. 
> 
> ...but in creation of an Object[], if you only need the 1 or 2 arg variant
> and therefore in slight speed decrease - hey, that's fine with me!

True, but that shouldn't be a problem with modern VMs (it is a short-lived 
object).


There are a couple of annoying glitches with said code though:
1. unless I am abused, parsing stops at the first 'invalid
DELIM_START/DELIM_STOP pair', i.e. "{blah} {}" or "{\\}". Shouldn't we continue
parsing in search of a good delimiter pair?
2. what if I want to pass in an Object[] as an argument to the log message? For
example:
    Object[] myArray = new Integer[] {new Integer(1)};
    log.debug("Array is: {}", myArray);
In this case, I am afraid formatted string will be "Array is: 1" instead of
"Array is: [[java.lang.Integer(1)".
3. you still need to modify all Logger classes for this code to be effective!

FYI, I came up with following code yesterday (didn't post it as I didn't have a
chance to thoroughly test it): it iterates over the messagePattern delimiter
pairs instead of the arguments array.
Note that I still have to handle the case "one {} and an Object[] arg" (previous
case 2).

  Cédrik


public static String format(String messagePattern, Object[] arguments) {
        int nUsedArgs = 0;
        int last = 0;
        final int len = messagePattern.length();
        int start = messagePattern.indexOf(DELIM_START);

        StringBuffer sbuf = null;// optimisation: will be created only if 
necessary

        while (start != -1 && (start + 1 != len)) {
                char delimStop = messagePattern.charAt(start + 1);
                char escape = messagePattern.charAt(start - 1);
                if ((delimStop != DELIM_STOP) || (escape == '\\')) {
                        // invalid DELIM_START/DELIM_STOP pair: find next one
                        last = start + 2;
                        start = messagePattern.indexOf(DELIM_START, last);
                        continue;
                }
                if (null == sbuf) {
                        sbuf = new StringBuffer(len + 24 * arguments.length);
                }
                sbuf.append(messagePattern.substring(last, start));
                sbuf.append((nUsedArgs < arguments.length) ? 
arguments[nUsedArgs] : null);
                ++nUsedArgs;
                last = start + 2;
                start = messagePattern.indexOf(DELIM_START, last);
        }
        if (null != sbuf) {
                if (last <= len) {
                        // append the characters following the last 
DELIM_START/DELIM_STOP pair.
                        sbuf.append(messagePattern.substring(last, len));
                }
                return sbuf.toString();
        } else {
                // there was no argument in messagePattern
                return messagePattern;
        }
}
_______________________________________________
dev mailing list
[email protected]
http://slf4j.org/mailman/listinfo/dev

Reply via email to