Class Unbox


  • public class Unbox
    extends java.lang.Object
    Utility for preventing primitive parameter values from being auto-boxed. Auto-boxing creates temporary objects which contribute to pressure on the garbage collector. With this utility users can convert primitive values directly into text without allocating temporary objects.

    Example usage:

     import static org.apache.logging.log4j.util.Unbox.box;
     ...
     long longValue = 123456L;
     double doubleValue = 3.14;
     // prevent primitive values from being auto-boxed
     logger.debug("Long value={}, double value={}", box(longValue), box(doubleValue));
     

    This class manages a small thread-local ring buffer of StringBuilders. Each time one of the box() methods is called, the next slot in the ring buffer is used, until the ring buffer is full and the first slot is reused. By default the Unbox ring buffer has 32 slots, so user code can have up to 32 boxed primitives in a single logger call.

    If more slots are required, set system property log4j.unbox.ringbuffer.size to the desired ring buffer size. Note that the specified number will be rounded up to the nearest power of 2.

    Since:
    2.6
    • Nested Class Summary

      Nested Classes 
      Modifier and Type Class Description
      private static class  Unbox.State  
      private static class  Unbox.WebSafeState
      State implementation that only puts JDK classes in ThreadLocals, so this is safe to be used from web applications.
    • Constructor Summary

      Constructors 
      Modifier Constructor Description
      private Unbox()  
    • Method Summary

      All Methods Static Methods Concrete Methods 
      Modifier and Type Method Description
      static java.lang.StringBuilder box​(boolean value)
      Returns a StringBuilder containing the text representation of the specified primitive value.
      static java.lang.StringBuilder box​(byte value)
      Returns a StringBuilder containing the text representation of the specified primitive value.
      static java.lang.StringBuilder box​(char value)
      Returns a StringBuilder containing the text representation of the specified primitive value.
      static java.lang.StringBuilder box​(double value)
      Returns a StringBuilder containing the text representation of the specified primitive value.
      static java.lang.StringBuilder box​(float value)
      Returns a StringBuilder containing the text representation of the specified primitive value.
      static java.lang.StringBuilder box​(int value)
      Returns a StringBuilder containing the text representation of the specified primitive value.
      static java.lang.StringBuilder box​(long value)
      Returns a StringBuilder containing the text representation of the specified primitive value.
      static java.lang.StringBuilder box​(short value)
      Returns a StringBuilder containing the text representation of the specified primitive value.
      private static int calculateRingBufferSize​(java.lang.String propertyName)  
      private static int ceilingNextPowerOfTwo​(int x)
      Calculate the next power of 2, greater than or equal to x.
      (package private) static int getRingbufferSize()
      For testing.
      private static java.lang.StringBuilder getSB()  
      private static Unbox.State getState()  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • LOGGER

        private static final Logger LOGGER
      • RINGBUFFER_SIZE

        private static final int RINGBUFFER_SIZE
      • MASK

        private static final int MASK
      • threadLocalState

        private static java.lang.ThreadLocal<Unbox.State> threadLocalState
    • Constructor Detail

      • Unbox

        private Unbox()
    • Method Detail

      • calculateRingBufferSize

        private static int calculateRingBufferSize​(java.lang.String propertyName)
      • ceilingNextPowerOfTwo

        private static int ceilingNextPowerOfTwo​(int x)
        Calculate the next power of 2, greater than or equal to x.

        From Hacker's Delight, Chapter 3, Harry S. Warren Jr.

        Parameters:
        x - Value to round up
        Returns:
        The next power of 2 from x inclusive
      • box

        public static java.lang.StringBuilder box​(float value)
        Returns a StringBuilder containing the text representation of the specified primitive value. This method will not allocate temporary objects.
        Parameters:
        value - the value whose text representation to return
        Returns:
        a StringBuilder containing the text representation of the specified primitive value
      • box

        public static java.lang.StringBuilder box​(double value)
        Returns a StringBuilder containing the text representation of the specified primitive value. This method will not allocate temporary objects.
        Parameters:
        value - the value whose text representation to return
        Returns:
        a StringBuilder containing the text representation of the specified primitive value
      • box

        public static java.lang.StringBuilder box​(short value)
        Returns a StringBuilder containing the text representation of the specified primitive value. This method will not allocate temporary objects.
        Parameters:
        value - the value whose text representation to return
        Returns:
        a StringBuilder containing the text representation of the specified primitive value
      • box

        public static java.lang.StringBuilder box​(int value)
        Returns a StringBuilder containing the text representation of the specified primitive value. This method will not allocate temporary objects.
        Parameters:
        value - the value whose text representation to return
        Returns:
        a StringBuilder containing the text representation of the specified primitive value
      • box

        public static java.lang.StringBuilder box​(char value)
        Returns a StringBuilder containing the text representation of the specified primitive value. This method will not allocate temporary objects.
        Parameters:
        value - the value whose text representation to return
        Returns:
        a StringBuilder containing the text representation of the specified primitive value
      • box

        public static java.lang.StringBuilder box​(long value)
        Returns a StringBuilder containing the text representation of the specified primitive value. This method will not allocate temporary objects.
        Parameters:
        value - the value whose text representation to return
        Returns:
        a StringBuilder containing the text representation of the specified primitive value
      • box

        public static java.lang.StringBuilder box​(byte value)
        Returns a StringBuilder containing the text representation of the specified primitive value. This method will not allocate temporary objects.
        Parameters:
        value - the value whose text representation to return
        Returns:
        a StringBuilder containing the text representation of the specified primitive value
      • box

        public static java.lang.StringBuilder box​(boolean value)
        Returns a StringBuilder containing the text representation of the specified primitive value. This method will not allocate temporary objects.
        Parameters:
        value - the value whose text representation to return
        Returns:
        a StringBuilder containing the text representation of the specified primitive value
      • getSB

        private static java.lang.StringBuilder getSB()
      • getRingbufferSize

        static int getRingbufferSize()
        For testing.