Adding a fixate method to StringBuilder and StringBuffer.

Tom Hawtin Thomas.Hawtin at Sun.COM
Wed Apr 15 20:46:16 UTC 2009

Paulo Levi wrote:
> Since CharSequence is obviously flawed in that it doesn't allow 
> efficient read-only views because of a missing method, there are various 
> methods in the jdk where a stringbuilder/buffer is built, populated and 
> then toString()-ed and left to be garbage collected. I'm seeing places, 
> especially in the Document classes, where this originates a OutOfMemory 
> exception, because the second buffers can't be created concurrently.
> I'm asking for a
> public final String fixate()
> method for both stringbuffer and builder that reuses the internal char 
> array on a private String constructor (that takes the array), and sets a 
> flag to never allow the buffer to be modified again.
> But what i would really like is that the CharSequence interface would 
> altered. CharSequence2.

This is the way StringBuffer worked prior to 1.5. That produced so many 
problems. It is widely known that 1.4 still suffers from unsafe 
publication issues (not that 1.4 *spec* has a sensible memory model at 
all). Obviously for StringBuilder, without synchronisation, it is way out.

Swing text classes, used reasonably, should not result in 
OutOfMemoryErrors. If you require to have lots of Strings sharing the 
same backing buffer, in Sun's current implementation you can use 
toString once followed by many String.substrings. Other 
performance-optimised implementations have different behaviour. If exact 
behaviour is important to you, then you will need to use your own 
immutable char[] wrapper class.

Tom Hawtin

More information about the core-libs-dev mailing list