Could ByteOrder be turned into an enum?
Rob Spoor
openjdk at icemanx.nl
Tue Oct 7 19:44:57 UTC 2025
Is it OK if I create a PR for this? Or is there a reason not to
implement this?
On 02/07/2025 04:49, Chen Liang wrote:
> Indeed, given that ByteOrder is more widely used and appears in many other
> APIs like FFM, it would be quite helpful to modernize it. There are other
> eligible candidates like CodingErrorAction, but their usages are more
> restricted to Buffer itself.
>
> On Tue, Jul 1, 2025 at 11:15 AM Rob Spoor <openjdk at icemanx.nl> wrote:
>
>> Hi all,
>>
>> I've been using ByteOrder quite a bit, but something that's always
>> annoyed me is that it's not an enum (because it predates them), and
>> therefore cannot be easily used in switch expressions or statements. For
>> instance, the closest I get is this, which still requires a default
>> statement:
>>
>> var i = switch (ByteOrder.nativeOrder()) {
>> case ByteOrder b when b.equals(ByteOrder.LITTLE_ENDIAN) -> 1;
>> case ByteOrder b when b.equals(ByteOrder.BIG_ENDIAN) -> 2;
>> default -> throw new IllegalStateException("not supported");
>> };
>>
>> I know that it's also possible to use a ternary expression, but that
>> depends on there never being a third value:
>>
>> var i = ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)
>> ? 1 : 2
>>
>>
>> As a little proof-of-concept I created the enum below and checked the
>> signatures with javap. Apart from a different super class (Object ->
>> Enum) and the extra values() and valueOf(String) methods, the two have
>> the same fields, constructors and methods with the same signatures. And
>> it would allow us to use this shorter switch expression:
>>
>> var i = switch (ByteOrder.nativeOrder()) {
>> case LITTLE_ENDIAN -> 1;
>> case BIG_ENDIAN -> 2;
>> };
>>
>> So my question is: are there technical limitations that would prevent
>> this change?
>>
>>
>> The enum I created:
>>
>> public enum ByteOrder {
>>
>> BIG_ENDIAN("BIG_ENDIAN"),
>> LITTLE_ENDIAN("LITTLE_ENDIAN"),
>> ;
>>
>> private final String name;
>>
>> ByteOrder(String name) {
>> this.name = name;
>> }
>>
>> private static final ByteOrder NATIVE_ORDER
>> = Unsafe.getUnsafe().isBigEndian()
>> ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN;
>>
>> public static ByteOrder nativeOrder() {
>> return NATIVE_ORDER;
>> }
>>
>> public String toString() {
>> return name;
>> }
>> }
>>
>>
>
More information about the core-libs-dev
mailing list