Si tengo una enumeración como esta:
public enum Letter {
A,
B,
C,
//...
}
¿Cuál es la mejor manera de elegir uno al azar? No necesita ser a prueba de balas de calidad de producción, pero una distribución bastante uniforme sería buena.
Podría hacer algo como esto
private Letter randomLetter() {
int pick = new Random().nextInt(Letter.values().length);
return Letter.values()[pick];
}
Pero hay una manera mejor? Siento que esto es algo que se ha resuelto antes.
Letter.values()
a crear una nueva copia de laLetter
matriz de valores internos .Respuestas:
Lo único que sugeriría es el almacenamiento en caché del resultado
values()
porque cada llamada copia una matriz. Además, no cree unaRandom
cada vez. Conserva uno. Aparte de eso, lo que estás haciendo está bien. Entonces:fuente
values()
matriz a una lista no modificable. ElVALUES
objeto ya está encapsulado en virtud de ser declaradoprivate
. Sería más simple Y más eficiente hacerloprivate static final Letter[] VALUES = ...
.Un único método es todo lo que necesita para todas sus enumeraciones aleatorias:
Cuál usarás:
También prefiero usar SecureRandom como:
fuente
Combinando las sugerencias de cletus y helios ,
Editar: Vaya, se me olvidó el parámetro de tipo limitado,
<E extends Enum<E>>
.fuente
E extends Enum<E>
?new RandomEnum<>(Season.class)
está permitido desde Java 7.RandomEnum
clase única sería buena como una micro biblioteca, si quisiera agruparla y publicarla en central.Linea sola
fuente
De acuerdo con Stphen C y helios. La mejor manera de obtener elementos aleatorios de Enum es:
fuente
fuente
Esta es probablemente la forma más concisa de lograr su objetivo. Todo lo que necesita hacer es llamar
Letter.getRandom()
y recibirá una carta de enumeración aleatoria.fuente
Probablemente sea más fácil tener una función para elegir un valor aleatorio de una matriz. Esto es más genérico y es fácil de llamar.
Llame así:
fuente
Aquí una versión que usa shuffle y streams
fuente
Solución simple de Kotlin
random()
es una función de extensión predeterminada incluida en la base Kotlin en elCollection
objeto. Enlace de documentación de KotlinSi desea simplificarlo con una función de extensión, intente esto:
Para hacerlo estático en su clase de enumeración. Asegúrese de importar
my.package.random
en su archivo de enumeraciónSi necesita hacerlo desde una instancia de la enumeración, pruebe esta extensión
fuente
Si hace esto para probar, podría usar Quickcheck ( este es un puerto Java en el que he estado trabajando ).
Admite todos los tipos primitivos, composición de tipos, colecciones, diferentes funciones de distribución, límites, etc. Admite corredores que ejecutan múltiples valores:
La ventaja de Quickcheck es que puede definir pruebas basadas en una especificación donde TDD simple funciona con escenarios.
fuente
Es fácil implementar una función aleatoria en la enumeración.
y luego lo llamas desde la clase lo necesitas así
fuente
Yo usaría esto:
fuente
Supongo que este método de retorno de una sola línea es lo suficientemente eficiente como para ser utilizado en un trabajo tan simple:
fuente