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