commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Julius Davies <juliusdav...@gmail.com>
Subject Re: svn commit: r1376505 - in /commons/proper/lang/trunk/src: main/java/org/apache/commons/lang3/ObjectUtils.java test/java/org/apache/commons/lang3/ObjectUtilsTest.java
Date Fri, 24 Aug 2012 05:26:04 GMT
Your tip helped more than I could have imagined.

I added unit tests for the doc examples......  oops.

yours,

Julius



On Thu, Aug 23, 2012 at 12:44 PM, Gary Gregory <garydgregory@gmail.com> wrote:
> J: You should enclose the code examples in the Javadoc in some <pre> tags
> and make sure it looks good ;)
>
> Gary
>
> On Thu, Aug 23, 2012 at 10:28 AM, <julius@apache.org> wrote:
>
>> Author: julius
>> Date: Thu Aug 23 14:28:14 2012
>> New Revision: 1376505
>>
>> URL: http://svn.apache.org/viewvc?rev=1376505&view=rev
>> Log:
>> [LANG-816] introduce CONST() methods to prevent Javac from inlining
>> constants
>>
>> Modified:
>>
>> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/ObjectUtils.java
>>
>> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java
>>
>> Modified:
>> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/ObjectUtils.java
>> URL:
>> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/ObjectUtils.java?rev=1376505&r1=1376504&r2=1376505&view=diff
>>
>> ==============================================================================
>> ---
>> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/ObjectUtils.java
>> (original)
>> +++
>> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/ObjectUtils.java
>> Thu Aug 23 14:28:14 2012
>> @@ -605,4 +605,170 @@ public class ObjectUtils {
>>          }
>>      }
>>
>> +
>> +    // Constants (LANG-816):
>> +    /*
>> +        These methods ensure constants are not inlined by javac.
>> +        For example, typically a developer might declare a constant like
>> so:
>> +
>> +            public final static int MAGIC_NUMBER = 5;
>> +
>> +        Should a different jar file refer to this, and the MAGIC_NUMBER
>> +        is changed a later date (e.g., MAGIC_NUMBER = 6), the different
>> jar
>> +        file will need to recompile itself.  This is because javac
>> +        typically inlines the primitive or String constant directly into
>> +        the bytecode, and removes the reference to the MAGIC_NUMBER field.
>> +
>> +        To help the other jar (so that it does not need to recompile
>> +        when constants are changed) the original developer can declare
>> +        their constant using one of the CONST() utility methods, instead:
>> +
>> +            public final static int MAGIC_NUMBER = CONST(5);
>> +     */
>> +
>> +
>> +    /**
>> +     * This method returns the provided value unchanged.
>> +     * This can prevent javac from inlining a constant
>> +     * field, e.g.,
>> +     *
>> +     *  public final static boolean MAGIC_FLAG = CONST(true);
>> +     *
>> +     * This way any jars that refer to this field do not
>> +     * have to recompile themselves if the field's value
>> +     * changes at some future date.
>> +     *
>> +     * @param v the boolean value to return
>> +     * @return the boolean v, unchanged
>> +     */
>> +    public static boolean CONST(final boolean v) { return v; }
>> +
>> +    /**
>> +     * This method returns the provided value unchanged.
>> +     * This can prevent javac from inlining a constant
>> +     * field, e.g.,
>> +     *
>> +     *  public final static byte MAGIC_BYTE = CONST(127);
>> +     *
>> +     * This way any jars that refer to this field do not
>> +     * have to recompile themselves if the field's value
>> +     * changes at some future date.
>> +     *
>> +     * @param v the byte value to return
>> +     * @return the byte v, unchanged
>> +     */
>> +    public static byte CONST(final byte v) { return v; }
>> +
>> +    /**
>> +     * This method returns the provided value unchanged.
>> +     * This can prevent javac from inlining a constant
>> +     * field, e.g.,
>> +     *
>> +     *  public final static byte MAGIC_CHAR = CONST('a');
>> +     *
>> +     * This way any jars that refer to this field do not
>> +     * have to recompile themselves if the field's value
>> +     * changes at some future date.
>> +     *
>> +     * @param v the char value to return
>> +     * @return the char v, unchanged
>> +     */
>> +    public static char CONST(final char v) { return v; }
>> +
>> +    /**
>> +     * This method returns the provided value unchanged.
>> +     * This can prevent javac from inlining a constant
>> +     * field, e.g.,
>> +     *
>> +     *  public final static byte MAGIC_SHORT = CONST(123);
>> +     *
>> +     * This way any jars that refer to this field do not
>> +     * have to recompile themselves if the field's value
>> +     * changes at some future date.
>> +     *
>> +     * @param v the short value to return
>> +     * @return the short v, unchanged
>> +     */
>> +    public static short CONST(final short v) { return v; }
>> +
>> +    /**
>> +     * This method returns the provided value unchanged.
>> +     * This can prevent javac from inlining a constant
>> +     * field, e.g.,
>> +     *
>> +     *  public final static byte MAGIC_INT = CONST(123);
>> +     *
>> +     * This way any jars that refer to this field do not
>> +     * have to recompile themselves if the field's value
>> +     * changes at some future date.
>> +     *
>> +     * @param v the int value to return
>> +     * @return the int v, unchanged
>> +     */
>> +    public static int CONST(final int v) { return v; }
>> +
>> +    /**
>> +     * This method returns the provided value unchanged.
>> +     * This can prevent javac from inlining a constant
>> +     * field, e.g.,
>> +     *
>> +     *  public final static byte MAGIC_LONG = CONST(123L);
>> +     *
>> +     * This way any jars that refer to this field do not
>> +     * have to recompile themselves if the field's value
>> +     * changes at some future date.
>> +     *
>> +     * @param v the long value to return
>> +     * @return the long v, unchanged
>> +     */
>> +    public static long CONST(final long v) { return v; }
>> +
>> +    /**
>> +     * This method returns the provided value unchanged.
>> +     * This can prevent javac from inlining a constant
>> +     * field, e.g.,
>> +     *
>> +     *  public final static byte MAGIC_FLOAT = CONST(1.0f);
>> +     *
>> +     * This way any jars that refer to this field do not
>> +     * have to recompile themselves if the field's value
>> +     * changes at some future date.
>> +     *
>> +     * @param v the float value to return
>> +     * @return the float v, unchanged
>> +     */
>> +    public static float CONST(final float v) { return v; }
>> +
>> +    /**
>> +     * This method returns the provided value unchanged.
>> +     * This can prevent javac from inlining a constant
>> +     * field, e.g.,
>> +     *
>> +     *  public final static byte MAGIC_DOUBLE = CONST(1.0);
>> +     *
>> +     * This way any jars that refer to this field do not
>> +     * have to recompile themselves if the field's value
>> +     * changes at some future date.
>> +     *
>> +     * @param v the double value to return
>> +     * @return the double v, unchanged
>> +     */
>> +    public static double CONST(final double v) { return v; }
>> +
>> +    /**
>> +     * This method returns the provided value unchanged.
>> +     * This can prevent javac from inlining a constant
>> +     * field, e.g.,
>> +     *
>> +     *  public final static byte MAGIC_STRING = CONST("abc");
>> +     *
>> +     * This way any jars that refer to this field do not
>> +     * have to recompile themselves if the field's value
>> +     * changes at some future date.
>> +     *
>> +     * @param v the genericized Object value to return (typically a
>> String).
>> +     * @return the genericized Object v, unchanged (typically a String).
>> +     */
>> +    public static <T> T CONST(final T v) { return v; }
>> +
>>  }
>>
>> Modified:
>> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java
>> URL:
>> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java?rev=1376505&r1=1376504&r2=1376505&view=diff
>>
>> ==============================================================================
>> ---
>> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java
>> (original)
>> +++
>> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java
>> Thu Aug 23 14:28:14 2012
>> @@ -450,6 +450,24 @@ public class ObjectUtilsTest {
>>          }
>>      }
>>
>> +    @Test
>> +    public void testConstMethods() {
>> +
>> +        // To truly test the CONST() method, we'd want to look in the
>> +        // bytecode to see if the literals were folded into the
>> +        // class, or if the bytecode kept the method call.
>> +
>> +        assertEquals("CONST(boolean)", true, ObjectUtils.CONST(true));
>> +        assertEquals("CONST(byte)", (byte) 3, ObjectUtils.CONST((byte)
>> 3));
>> +        assertEquals("CONST(char)", (char) 3, ObjectUtils.CONST((char)
>> 3));
>> +        assertEquals("CONST(short)", (short) 3, ObjectUtils.CONST((short)
>> 3));
>> +        assertEquals("CONST(int)", 3, ObjectUtils.CONST(3));
>> +        assertEquals("CONST(long)", 3l, ObjectUtils.CONST(3l));
>> +        assertEquals("CONST(float)", 3f, ObjectUtils.CONST(3f), 0);
>> +        assertEquals("CONST(double)", 3.0, ObjectUtils.CONST(3.0), 0);
>> +        assertEquals("CONST(Object)", "abc", ObjectUtils.CONST("abc"));
>> +    }
>> +
>>      /**
>>       * String that is cloneable.
>>       */
>>
>>
>>
>
>
> --
> E-Mail: garydgregory@gmail.com | ggregory@apache.org
> JUnit in Action, 2nd Ed: <http://goog_1249600977>http://bit.ly/ECvg0
> Spring Batch in Action: <http://s.apache.org/HOq>http://bit.ly/bqpbCK
> Blog: http://garygregory.wordpress.com
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory



-- 
yours,

Julius Davies
604-222-3310 (Home)

$ sudo apt-get install cowsay
$ echo "Moo." | cowsay | cowsay -n | cowsay -n
http://juliusdavies.ca/cowsay/

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Mime
View raw message