新しいキャッシュ・アルゴリズムの記述

このセクションでは、アプリケーション特有の要件を満たす、カスタム・キャッシュ・アルゴリズムを記述する方法について説明します。このセクションで使用する例は、 IlvDefaultTileCache クラス (JViews Maps ライブラリーにあります) の簡易版です。
この例のソース・コード一式は、以下のファイルにあります。
クラス SimpleTileCache は、クラス IlvTileCache を機能拡張します。
public class SimpleTileCache 
  extends IlvTileCache
{
cacheSize では、キャッシュに格納可能なタイルの最大数を定義します。
  // default cache size
  private int cacheSize = 5;
  // To Store the tiles
  transient private Vector tiles = new Vector();
以下のコンストラクターでは、特定のサイズ (この例では 5) のデフォルト・キャッシュのインスタンスを作成します。
 public SimpleTileCache(int size)
  {
    cacheSize = size;
  }
以下のコンストラクターでは、提供された入力ストリームからキャッシュを読み込みます。このコンストラクターを使用して作成したキャッシュは IlvPersistentObject インターフェースを実装するため、IlvTiledLayer オブジェクトで保存できます。
  public SimpleTileCache(IlvInputStream stream)
  throws IlvReadFileException
  {
    cacheSize = stream.readInt("size");
  }
write() メソッドでは、出力ストリームにキャッシュを書き込みます。
 public void write(IlvOutputStream stream) 
    throws IOException
  {
    super.write(stream);
    stream.write("size", cacheSize);
  }
以下のメソッドは、 IlvTileCache インターフェースに属します。このメソッドは、タイルのキャッシュ時に呼び出されます。この実装では、タイルは内部タイル一覧の末尾に追加されます。
  public void tileCached(IlvTile tile)
  {
    tiles.addElement(tile);
  }
以下のメソッドは、 IlvTileCache インターフェースに属します。このメソッドは、タイルをキャッシュから削除し、再びロックすると呼び出されます。この実装では、タイルは内部タイル一覧から削除されます。
  public void tileRetrieved(IlvTile tile)
  {
    tiles.removeElement(tile);
  }
以下のメソッドは、 IlvTileCache インターフェースに属します。このメソッドは、タイルのロード直前に呼び出されます。この実装では、キャッシュのタイル数がキャッシュ・サイズを超えた場合に、内部タイル一覧の先頭にある LRU タイルがアンロードされ、新規タイルの領域を確保します。
  public void tileAboutToLoad(IlvTile tile)
  {
    int toRemove = tiles.size() - cacheSize;
    if (toRemove <= 0)
      return;
    for (int i = toRemove; i > 0; i--) {
      IlvTile current = (IlvTile) tiles.elementAt(0);
      tiles.removeElementAt(0);
      releaseTile(current);
    }
  }
以下のメソッドは、 IlvTileCache インターフェースに属します。このメソッドは、タイル・レイヤーをマネージャーから取り出し、タイル・コントローラーが管理するタイルをキャッシュから削除すると呼び出されます。
  public void controllerDisposed(IlvTileController controller)
  {
    int i = 0;
    while (i < tiles.size()) {
      IlvTile tile = (IlvTile) tiles.elementAt(i);
      if (tile.getController() == controller) 
        tiles.removeElementAt(i);
      else
        i++;
    }
  }