سؤال
حالة استخدام الارتباط:
read input
if (correlation-id is already generated for this input)
{
lookup the correlation-id from the cache;
return correlation-id;
}
else
{
generate the correlation-id;
cache it;
return correlation-id;
}
القيود: - يمكن أن يذهب عدد سجلات الإدخال حتى 500 ألف ، لذا لا يريد استخدام مراجع قوية. -لا تريد إنشاء تجزئة في اتجاه واحد حتى الآن (أعرف أنه إذا استخدمنا تجزئة في اتجاه واحد ، فلا داعي لذاكرة التخزين المؤقت)
هل يمكن لأحد أن يخبرني كيفية استخدام ComputingMap لهذا. أنا أسأل هذا لأن هناك ملاحظة في Javadoc تقول "إنها تستخدم مساواة الهوية للمفاتيح الضعيفة/الناعمة".
المحلول
مع فئات Google Guava/Collection ومفاتيح أو قيم ناعمة أو ضعيفة ، يجب أن تكون مفاتيحك مراجعًا قوية للخريطة لاستخدام متساوٍ () وليس == للبحث عن القيم المخبأة. إذا كان لديك مفاتيح ضعيفة/ناعمة ، فسيتم البحث مع الهوية ، لذا ستحصل دائمًا على ذاكرة التخزين المؤقت. لذا ، إذا كنت تريد أن يقوم جامع القمامة بتجميع عناصر GC من ذاكرة التخزين المؤقت الخاصة بك ، فستحتاج إلى جعل القيم ناعمة أو ضعيفة.
أتفهم أن Google ستضيف ميزة تكافؤ في المستقبل حتى تتمكن من تحديد ما إذا كنت تريد متساوًا () أو == وليس لديك هذا الخيار عن طريق اختيار المراجع القوية أو الضعيفة أو الناعمة.
نظرًا لأن كائن tuple الخاص بك ينفذ متساويًا () و hashcode () ، فأنت تفعل فقط
new MapMaker()
.softValues()
.makeComputingMap(new Function<Tuple,String>() {
public String apply(Tuple t) {
// generate the correlation-id
}
});