que - No se puede encontrar una implementación moderna del conjunto de objetos en Java
para que sirve el comando super en java (9)
Estoy buscando una implementación moderna de un grupo de objetos en Java. Puedo ver el Apache Commons uno, pero para ser honesto, preferiría uno que use genéricos y el material de simultaneidad de las versiones más recientes de Java.
¿El fondo común realmente funciona bien? El código se ve bonito, erm, feo.
Necesitaría algo que permita la validación personal personalizada, etc.
¡Gracias!
Puedo ver el Apache Commons uno, pero para ser honesto, preferiría uno que use genéricos y el material de simultaneidad de las versiones más recientes de Java.
Bueno, el hecho es que este tipo de proyectos (grupos de objetos genéricos) no reciben mucha tracción porque hay poca necesidad de ellos hoy en día (la creación de objetos es barata). Esto probablemente explique por qué no los ve mucho (y, de hecho, solo conozco el fondo común).
Dicho esto, si los genéricos son su principal preocupación, puede parchear Commons Pool, ver POOL-83 , tiene un parche adjunto.
¿El fondo común realmente funciona bien? El código se ve bonito, erm, feo.
Tiene algunos errores conocidos (cuatro) pero, que yo sepa, funciona. Y con respecto a la última oración, bueno, si crees que puedes escribir algo mejor, y si tienes tiempo para eso, ¿por qué no hacerlo?
Necesitaría algo que permita la validación personal personalizada, etc.
No tienes un número infinito de opciones. Ya sea
- Encuentre algo que haga todo lo que necesita (no conozco una biblioteca así, lo que no significa que no haya ninguna).
- Si no puede encontrar algo que haga todo lo que necesita de inmediato, extienda una solución existente.
- Tira tu propia solución.
Checkout KBOP. Es un hilo seguro que bloquea una sola clave para un solo objeto o una sola clave para el grupo de objetos múltiples. Es liviano y no agrega dependencias adicionales.
Commons Pool es un buen candidato para su proyecto.
- Interfaz genérica : el problema más obvio con el grupo común es su interfaz pre-genéricos. Hay varias formas de evitar esto. Usted puede
- hacer casting;
- implementar una interfaz paralela que haga el casting por usted; o
- usa el POOL-83 que Pascal identificó
- Material de simultaneidad de Java más reciente : este es un detalle de implementación que no debería preocuparle. Si la concurrencia es correcta, entonces no importa cómo se logró la corrección. Alternativamente, una implementación de grupo que usa las cosas más recientes pero cuya concurrencia es incorrecta sigue siendo un candidato pobre.
- Código feo : se supone que debes usarlo, no casarse con él.
- Validación de Live Liveness : implemente validateObject para probar la vida de los objetos. Los objetos muertos serán destruidos. También puede implementar una tarea Cron para tomar prestados y devolver objetos periódicamente, lo que obliga a la eliminación oportuna de los objetos muertos.
Es difícil hacer una recomendación sin saber qué características necesita.
Si se fija el número de objetos en el grupo, puede usar un BlockingQueue
como en este ejemplo de la pregunta mencionada por @codedevour
Si los valores que desea agrupar pueden asociarse con una clave, puede usar MapMaker de Guava
ConcurrentMap<Key, Connection> connections = new MapMaker()
.concurrencyLevel(32)
.softKeys()
.weakValues()
.expiration(30, TimeUnit.MINUTES)
.evictionListener(
new MapEvictionListener<Key, Connection>() {
public onEviction(Key key, Connection connection) {
connection.close();
}
});
.makeComputingMap(
new Function<Key, Connection>() {
public Connection apply(Key key) {
return createConnection(key);
}
});
Esto parece estar relacionado con su pregunta, tal vez debería considerar escribir un grupo de objetos por su cuenta. ¿Funciona este grupo básico de objetos de Java? .
La agrupación se introdujo inicialmente como una acción de ajuste para el rendimiento lento de la creación de objetos y la recolección de basura en particular. En una JVM moderna> 1.4, la agrupación ya no es necesaria para la optimización de la gestión de memoria en una aplicación comercial típica. Incluso puede tener un efecto negativo en el rendimiento del recolector de basura. En casos especiales, como crear millones de instancias en cada llamada a un método, aún podría dar resultado.
Sin embargo, la agrupación de instancias sigue siendo interesante para los objetos con una "construcción posterior" lenta y personalizada. En algunos casos, desea inyectar algunas dependencias después de la creación del objeto, leer alguna configuración, etc. Esto puede ser lento y no tiene que realizarse una y otra vez. En tales casos, la agrupación de objetos mejorará el rendimiento general.
Adam Bien: la agrupación de objetos puede ser útil, por razones completamente diferentes
¿Qué piensas de la mejora de Commons Pool Framework? Podría hacer algunas refactorizaciones y agregar la parte genérica, sería bueno para otros también.
Existe una implementación de grupo de objetos en http://code.google.com/p/spf4j/ . Encuentro una implementación mejor que la de Apache commons. El código no es tan feo y funciona mejor ...
Para agrupar es la forma tradicional, para caché es la manera moderna. Y hay muchas implementaciones modernas de caché por ahí.
Para conocer las diferencias entre esos dos, puede leer esto: http://www.informit.com/guides/content.aspx?g=java&seqNum=104
Mi opinión es que podemos usar una biblioteca de caché para agrupar nuestros objetos pero no al revés. Solo no olvide volver a inicializar el objeto una vez que lo hayamos obtenido del caché. Entonces, ¿por qué molestarse en tener dos animales diferentes (caché y grupo) si puede lograr todo simplemente usando uno?
Para el lado de los genéricos, ¿por qué no usar simplemente la biblioteca no genérica y crear un contenedor que use para acceder a la biblioteca no genérica que se ocupa de la conversión? De esta forma, hay un único lugar donde se realiza el lanzamiento, que al menos limpiará un poco el código.
Sin embargo, otro grupo ( yapool ) contiene una implementación de conjunto genérico con la opción de actuar en eventos de grupo a través de oyentes ( example ). Esto proporciona una gran flexibilidad para personalizar el comportamiento de la agrupación, agregar funciones y diagnosticar el uso de recursos de la agrupación. Alternativamente, también puede extender una implementación de grupo para agregar su propio comportamiento deseado ( example ). Esto debería ser relativamente sencillo ya que las implementaciones de grupo ya se extienden entre sí (Básico -> Encuadernado -> Cortado).
Para empezar, puede usar un BoundPool simple y establecer su propia fábrica (consulte, por ejemplo, "LongFactory" en el ejemplo de eventos del grupo mencionado anteriormente), o simplemente use un ObjectPool .
Yapool no tiene bloques "sincronizados" y es bastante rápido.