Создать HashMap как кеш для объектов, проблема с ключевым объектом - PullRequest
0 голосов
/ 03 августа 2011

Я новичок в Java, я работаю ширина Android SDK

Я генерирую много объектов, которые на 50% те же, поэтому я подумал, что могу реализовать простой механизм кэширования

private HashMap<CachePathKey, Path> mCachedPaths;



public Path GenerateRealPath(final Sprite pSprite,final int pStartIndex){

    CachePathKey mCachedKey = new CachePathKey(mPathID, pStartIndex, MyGame.mCamera.getZoomFactor(), pSprite.getWidth(), pSprite.getHeight());

    if (!mCachedPaths.containsKey(mCachedKey)){
       //generate Path Object to p 
       mCachedPaths.put(mCachedKey,p);
       return p;
    } else {
       return mCachedPaths.get(mCachedKey);
    }

и CachePathKey:

class CachePathKey {
private int mPathID;
private int mStartIndex;
private float mZF;
private float mWidthSprite;
private float mHeightSprite;
public CachePathKey(int pPathID, int pStartIndex, float pZf,
        float pWidthSprite, float pHeightSprite) {
    this.mPathID =pPathID;
    this.mStartIndex = pStartIndex;
    this.mZF = pZf;
    this.mWidthSprite = pWidthSprite;
    this.mHeightSprite = pHeightSprite;
}
}

но я имею значение null как ключи при отладке, и содержит ключ, возвращающий всегда false

что я делаю не так?

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Код, который вы разместили, не может привести к null ключам на карте mCachedPaths.Таким образом, вы должны посмотреть из этого кода снаружи, чтобы увидеть, кто ставит эти нулевые ключи.

Вы также должны переопределить Equals и HashCode методы в вашем классе CachePathKey, используя поля mPathID и mZf (полячто делает ваш объект уникальным).В среде IDE eclipse позволяет вам (из контекстного меню в Eclipse) автоматически переопределять эти методы, используя выбранные пользователем классы.

Я также настоятельно рекомендую прочитать Chapter9 в Effective Java 2nd edition книга.

1 голос
/ 03 августа 2011

для CachePathKey необходимо переопределить метод равенства и хэш-код

Поскольку у вас есть уникальный идентификатор объекта, выполните равный тест для mPathID

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...