Just a quick question about how parameters are passed in Java...
...
if ((index = stdout.indexOf(pattern)) != -1) {
tidy(stdout, index + pattern.length());
return true;
} else if ((index = stderr.indexOf(pattern)) != -1) {
tidy(stderr, index + pattern.length());
return true;
...
private void tidy(StringBuffer buffer, int i) {
logger.info("Truncating buffer: " + buffer);
buffer = new StringBuffer(buffer.substring(i));
logger.info("Buffer now: " + buffer);
}
In this case, will stdout and stderr (used as parameters in tidy()) have their values changed to new StringBuffer(buffer.substring(i))? My assumption is that they will as object variables(object pointers) are always passed-by-value?
解决方案
You misstate what is going on here -- the object references are passed by value (a copy of the reference is made), so stdout and stderr do not get modified when you call tidy. The copies that are made of them get modified when you execute line 2 of tidy.
Parameter passing in Java is a source of confusion for a lot of people. Here's a good explanation.