2012-01-23 5 views
2

私は、オブジェクトをディスクに永続化するためのCacheオブジェクトを持っています。これを実装した方法で、@SupressWarningsを使用する必要があります。私はJavaのエキスパートではありませんが、これはコードの臭いのようです。私がここでやっていることを実行するための「より良い」方法があるかどうかは疑問です(たとえば、特定のタイプをインスタンス化できるようにこの値を読み取っていますか?)。 GET()オブジェクトの任意の型を返すことができますので、私は今、時に元の型に戻し、それをキャストする必要があり@SuppressWarnings(「未チェック」)を使用しなくて済むようにするにはどうすればいいですか?

/** 
* Write object o to cache file 
* 
* @param cacheName 
* @param o 
*   Serializable object to write to cache 
*/ 
public static void put(String cacheName, Serializable o) throws IOException { 
    FileOutputStream fos = new FileOutputStream(getHashedFileName(cacheName)); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    oos.writeObject(o); 
    fos.close(); 
} 

/** 
* Get an object from the cache. Caller should use exists() before calling 
* here to make sure the cache item exists otherwise Exception will be 
* thrown 
* 
* @param cacheName 
* @return Object from cache 
*/ 
public static Object get(String cacheName) throws CacheNotFoundException, 
     IOException, ClassNotFoundException { 
    FileInputStream fis = new FileInputStream(getHashedFileName(cacheName)); 
    ObjectInputStream ois = new ObjectInputStream(fis); 
    Object o = ois.readObject(); 
    return o; 
} 

マイCacheオブジェクトは、この(簡潔にするため削除関連のないコード)のように見えます私はキャッシュから読みました。コードに近い@SuppressWarningsを動かす示唆人々のために、注釈が宣言されている行のみを使用することができので、この:編集

class somethingDoingSomeWork { 

    /** 
    * Save all work done to the cache. 
    * @throws IOException 
    */ 
    public void saveToCache() throws IOException { 
     Cache.put(getCacheKey(), (MyObject<String>) summary); 
    } 

    /** 
    * Repopulate from cache 
    */ 
    @SuppressWarnings("unchecked") 
    public boolean loadFromCache() throws IOException, CacheNotFoundException, 
      ClassNotFoundException { 
     // Code removed, checking for existence of cache, etc. 

     // Cast required here, and this row generates unchecked warning 
     summary = (MyObject<String>) Cache.get(getCacheKey()); 
     return true; 
    } 
} 

:私は、私が最初の場所での警告の生成を避けることができればと思いまして助けてくれません

また、ジェネリックスの助けを借りても、それはCache.get()メソッドに問題を移しているようです。最善の解決策は、このように表示されます。http://www.velocityreviews.com/forums/t499693-how-do-you-prevent-unchecked-cast-warning-when-reading-from-objectinputstream.html

+3

メソッド全体ではなく、@SuppressWarnings( "unchecked") 'を文に使用できることをご存知でしたか? – adarshr

+0

おそらくジェネリックスを使用できますか? – hage

+0

無関係ですが、キャッシュをインスタンスにしてから、静的メソッドの代わりに通常のメソッドを使用する必要があります。 – Luciano

答えて

1

ここで私がやっていることを「より良い」方法があると思います(たとえば、キャッシュを書き込むときに何らかの形でデータを格納し、この値を読み取って特定のタイプですか?)

ここにジェネリックを使用してください。お持ちの場合

public <String, P extends Serializable> R get(String key); 
public <String, P extends Serializable> void put(String key, R value); 

私はすでに既存のキャッシュ実装を指していません。 Guavaのように、これらのキャッシュはとにかにサポートされていますが、このコードを改善したいと願っています。

最後の手段として、@SupressWarningsをできるだけコードの近くに置くことが大切です。

+0

@SuppressWarningsはラインやブロックには適用できません。メソッド/クラスのみ? – mozboz

+0

こんにちはhttp://docs.oracle.com/javase/1.5.0/docs/api/java/lang/SuppressWarnings.htmlこのような場所で@supressWarningを使用できると言います。@Target(valueあなたのコードでは//ここに必要なキャストのような場所をsupresswarningすることができます。この行は未確認の警告を生成します @SuppressWarnings( "未チェック") 要約=({ MyObject )Cache.get(getCacheKey()); //これを試してみるとうまくいきます –

2

キーと値の両方がSerializableは、あなたがこれらのシグネチャ

public <R extends Serializable, P extends Serializable> R get(P key); 
public <R extends Serializable, P extends Serializable> void put(P key, R value); 
+0

この理由がわかるようにするには
MyObject summary; summary = Cache.get(someKey); 2番目の行は、コンパイラがタイプRを決定することを可能にするため、キャストは不要ですか? (申し訳ありませんが、完全なマークダウンはここでは失敗します) – mozboz

+0

また、このメソッドでは、この行をget()で変更する必要はありません。Object o = ois.readObject(); R o =(R)ois.readObject();これは次のようになります。それはちょうど問題をどこか別の場所に移しましたか? – mozboz

0

を使用できると仮定すると、あなたがここに必要なキャストこの

//のように持ってどこ、この行は未確認の警告を生成します
要約=(MyObject)Cache.get(getCacheKey());

この優れたオプションを使用してCollectionHelperクラスを作成せず、CollectionHelperクラスで未確認の警告を生成するため、未確認の警告が生成されます。 CollectionHelperクラスを使用して、そのクラスのオブジェクトを返します。例えば

public class CollectionsHelper { 
    /** 
    * 
    * @param list 
    *   of List type 
    * @return list - List of MyObject type 
    */ 
    @SuppressWarnings("unchecked") 
    public static List<MyObject> getMyObjects(List list) { 
     return (List<MyObject>) list; 
    } 
} 

、この方法あなたがあなたのサービスや実装クラスで@SupressWarningsを追加する必要はありません

List<MyObject> objList = CollectionsHelper.getMyObjects(Cache.get(getCacheKey()); 

でそれを使用しています。

関連する問題