/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the Common Development
* and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at
* src/com/vodafone360/people/VODAFONE.LICENSE.txt or
* http://github.com/360/360-Engine-for-Android
* See the License for the specific language governing permissions and
* limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each file and
* include the License file at src/com/vodafone360/people/VODAFONE.LICENSE.txt.
* If applicable, add the following below this CDDL HEADER, with the fields
* enclosed by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
* Copyright 2010 Vodafone Sales & Services Ltd. All rights reserved.
* Use is subject to license terms.
*/
package com.vodafone360.people.utils;
import java.util.ArrayList;
/**
* This is a static utility class representing the StringBuffer,
* pool. StringBuffer objects can be retrieved from the pool
* and released back to the pool when necessary.
* This class must to be used anywhere where String
* concatenation operations are intensively performed
* to avoid too many objects being generated and GC
* slowing down the performance.
*/
public class StringBufferPool {
/**
* Synchronization.
*/
private static Object mutex = new Object();
/**
* The list of free StringBuffers.
*/
private static ArrayList<StringBuffer> free = new ArrayList<StringBuffer>(5);
/**
* The constructor.
*/
private StringBufferPool() {}
private static StringBuffer allocStringBuffer(String str) {
return new StringBuffer(str);
}
private static StringBuffer allocStringBuffer() {
return new StringBuffer();
}
private static StringBuffer getFreeStringBuffer() {
StringBuffer retValue = null;
if (!free.isEmpty()) {
retValue = (StringBuffer)free.get(free.size() - 1);
free.remove(free.size() - 1);
}
return retValue;
}
/**
* This method returns a StringBuffer object from the pool...
* @param str String - the string to initialize the StringBuffer with.
* @return StringBuffer object from the pool
*/
public static StringBuffer getStringBuffer(String str) {
synchronized (mutex) {
StringBuffer sb = getFreeStringBuffer();
if (sb == null)
sb = allocStringBuffer(str);
else
sb.append(str);
return sb;
}
}
/**
* This method returns a StringBuffer object from the pool...
* @return StringBuffer object from the pool.
*/
public static StringBuffer getStringBuffer() {
synchronized (mutex) {
StringBuffer sb = getFreeStringBuffer();
if (sb == null) sb = allocStringBuffer();
return sb;
}
}
/**
* This method calls releases the provided StringBuffer to the pool...
* @param sb StringBuffer - the StringBuffer to be released.
* @return StringBuffer object from the pool.
*/
public static void releaseStringBuffer(StringBuffer sb) {
if (sb != null) {
sb.setLength(0);
synchronized (mutex) {
free.add(sb);
}
}
}
/**
* This method calls toString() method on the provided
* StringBuffer object and releases it to the pool...
* @param sb StringBuffer - the StringBuffer to be released.
* @return String the toString() method result called on
* the provided StringBuffer.
*/
public static String toStringThenRelease(StringBuffer sb) {
String str = sb.toString();
releaseStringBuffer(sb);
return str;
}
}