On 03/09/2015 10:11 AM, Andrew Haley wrote:
On 08/03/15 23:21, Remi Forax wrote:
BE doesn't need to be an instance, method of Unsafe are instance methods
just to enforce security,
you can not call them if you don"t have an instance of Unsafe (and
getUnsafe() does the security check).
BE is private so it doesn't have to be an instance field it can be
static field.
And I agree with you that the native isBigEndian() should be called once
in the lifetime of the VM.
so the idea is to write:
public boolean isBigEndian() {
return BE;
}
private static final boolean BE = isBigEndian0();
private static native boolean isBigEndian0();
I understand. However, the callers of isBigEndian() do their own
caching, so it seems to me that this will be a case of double-caching.
It's not important from a performance point of view, but it is
additional complexity.
Andrew.
If we take a look at status quo, then the pattern for safe constant
state in Unsafe is as follows:
public native int arrayBaseOffset(Class<?> arrayClass);
/** The value of {@code arrayBaseOffset(boolean[].class)} */
public static final int ARRAY_BOOLEAN_BASE_OFFSET
= theUnsafe.arrayBaseOffset(boolean[].class);
...this has the benefit that it doesn't require caching at use site. But
the above pattern could be tweaked a bit in case of isBigEndian(). The
method could be declared as private since it does not add a utility like
above method which is a function of 1 argument.
The argument that we don't want to expose public API is unfounded as
Unsafe won't be visible to normal code in JDK9, right?
Regards, Peter