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 <open...@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;
>          }
>      }
>
>

Reply via email to