2011-08-03 9 views
0

を持つオブジェクトのキャッシュ、問題としてHashMapを作成します。は、私が</p> <p>Imは、50%のTE中に同一の多数のオブジェクトを生成するので、私は私と思っ幅アンドロイドSDKを働いている私は、Javaに新たなんだキーオブジェクト

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; 
} 
} 

しかし、デバッグ、およびのcontainsKeyは常にfalse

012を返すとき、私はキーとしてヌルをしました:シンプルなキャッシュ機構

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を実装することができますすることです

私は間違っているのですか?

答えて

1

に等しいテストを行うあなたはCachePathKey、

のためのイコールとhashCodeメソッドをオーバーライドする必要があります地図。したがって、あなたはこのコードから誰がこれらのヌルキーを置いているかを見るべきです。

また、CachePathKeyクラスのEqualsおよびHashCodeメソッドを、mPathIDフィールドとmZfフィールド(オブジェクトを一意にするフィールド)を使用してオーバーライドする必要があります。そのようなEclipseを持つEclipseは、エンド・ユーザーが選択したクラス・メンバーを使用して、これらのメソッドを自動的にオーバーライドすることができます(Eclipseのコンテキスト・メニューから)。

また、Chapter9 in Effective Java 2nd edition本の読書を強くお勧めします。

1

あなたがオブジェクトの一意に識別しているので、あなたが投稿したコードがmCachedPathsnullキーにつながることができませんmPathID

+0

すべてが一意で、aは(mPathID = 1、mZF = 1)または(mPathID = 1、mZF = 0.9f)を持つことができます –

+0

あなたはあなたのオブジェクトを一意に識別する必要があります –

+0

は、 !ありがとう –

関連する問題

 関連する問題