java java-8 bit-fields enumset

Justificación para usar un campo de bits en lugar de EnumSet en la moderna API Java 8



java-8 bit-fields (2)

¿Debería reconsiderar el consejo común de mejores prácticas para nunca utilizar bitfields?

Sí. En general, debería reconsiderar cualquier consejo que contenga las palabras "siempre" o "nunca", sin importar si es "común" o no tan común.

EnumSet , tan antiguo como la propia enum (ambos desde Java 5), ​​se supone que es un reemplazo no comprometedor para el caso de uso de los campos de bits: tan rápido y pobre como el campo de bits (bueno, excepto que no es un tipo primitivo) y seguro arrancar. Por otro lado, la API de Java más reciente y durante años, la API de Streams, descaradamente utiliza Spliterator bits para las características de Spliterator .

¿Debería considerar lo anterior como una admisión clara por parte de los expertos clave de Java de que EnumSet no es tan bueno después de todo? ¿Debería reconsiderar el consejo común de mejores prácticas para nunca utilizar bitfields?


EnumSet sorprendió bastante ver que está usando EnumSet lugar de EnumSet . El racional aunque se discute en este hilo de la lista de correo. Parece que la razón fue para poder establecer y deshacer varias características sin afectar el que está en el extremo de la persona que llama. Con un EnumSet , para implementar esto, uno necesitaría crear un nuevo objeto EnumSet cada vez que hay una necesidad de cambiarlo en diferentes etapas. Supongo que esta es la razón por la cual los campos de bit ganan la carrera allí.

La oración final de ese hilo esencialmente anticipa su pregunta aquí:

La presencia de tales banderas en una API de Java 8 generaría (y debería) mucha atención, porque va en contra de lo que se ha dicho a las personas durante más de una década. Si se adopta tal cual, mejor será una buena explicación para los lectores del doc de por qué se rechazaron las alternativas. "Nos sentimos cómodos con las banderas int y nada más se sugirió significativamente mejor" no lo cortará. "Sabemos que las banderas int no son geniales para una API, pero tratamos muy duro de encontrar mejores alternativas, en vano" (si fuera cierto).