Simplemente, tengo que anular la forma en que la memoria caché elige la clave correcta porque algunos campos (p. Ej., Marca de tiempo, id de mensaje, etc.) no deben considerarse cuando recuperar una clave. No puedo modificar la función hash real del objeto clave porque ya se usa para reconocer en mi código.
¿Es posible con Cachés de guayaba? Y con una solución?
Esta es mi configuración:Equal/hash personalizado al insertar la clave (Guava Cache)
CacheBuilder.newBuilder().maximumSize(CACHE_SIZE).recordStats().
expireAfterWrite(DEFAULT_AGE, TimeUnit.DAYS).build(
new CacheLoader<Request, Response>() {
@Override
public Response load(Request request) {
return request.getResponse();
}
});
y este es mi función hash (utilizado en otra parte de mi código):
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + code;
result = prime * result + messageID; // <= **this one shouldn't evaluated**
result = prime * result + Arrays.hashCode(payload);
result = prime * result + (int) (timestamp^timestamp >>> 32); // <= **this one shouldn't evaluated**
result = prime * result + (type == null ? 0 : type.hashCode());
result = prime * result + version;
return result;
}
Por cierto, es este tipo de caché utilizando su propia implementación de función hash (p. ej., a través de la introspección) o está utilizando la predeterminada?
** EDIT: **
Como se señaló en las respuestas, la mejor manera de lograr este resultado es una clase contenedora.
Mi solución:
/**
* Nested class to store a request as a key in the cache. It is needed to
* normalize the variable fields of the normal requests.
*/
private static final class CachedRequest extends Request {
private static CachedRequest fromRequest(Request request) {
// set only the fields that cannot change between two same requests
// ...
}
@Override
public int hashCode() {
HashFunction hashFunction = Hashing.md5();
HashCode hashCode;
// ...
return hashCode.asInt();
}
@Override
public boolean equals(Object obj) {
// coherent with hashCode()
// ...
}
}
No me puedo imaginar que sería una utilidad muy útil si utilizara su propia implementación hash. – jtahlborn
también, ¿puede explicar mejor a qué se refiere con "No puedo modificar mi función hash() porque ya se usa para reconocer que" real "equivale a objetos."? – jtahlborn
De hecho, no estoy pidiendo agregar esta característica, pero si alguien sabe cómo manejar esta situación. – Hamal000