:
public class CustomHashtable<K, V> extends Hashtable<K, V> {
/** Default instance. */
private final V defaultValue;
public CustomHashtable(V defaultValue) {
this.defaultValue= defaultValue;
}
@Override
public synchronized V get(Object key) {
if(key != null) {
V val = super.get(key);
if(val != null) {
return val;
}
}
return defaultValue;
}
}
(デフォルトインスタンスのソリューションをカバーしても、より柔軟で、私はまだJonの工場出荷時のソリューションを好みます)基本的に間違っている。あなたのクラスのメソッドをチェックアウトします。それらの大部分は今やget
と矛盾します。さらに悪いことに、メソッドが他のパブリックメソッドの観点からどのように実装されているかは定義されていません - 継承の呪いなどです。
したがって、達成しようとしている抽象を表すクラスを作成します。 にはが含まれていて、適切なマップの実装から継承されていません。
この場合の自然マップはおそらく古くはありませんHashtable
しかしjava.util.concurrent.ConcurrentHashMap
です。ここでの重要な方法は[putIfAbsent
] [2]です。残念ながら、APIドキュメントは吸う。ここではそれを使用すべきかです:
public V getOrCreate(K key) {
final V value = map.get(key);
if (value != null) {
return value;
}
V newValue = factory.create(key); // May discard.
V oldValue = map.putIfAbsent(key, value);
return oldValue==null ? newValue : oldValue;
}
(あなたが値を破棄したことがないことを確実にしたい場合は、Future
を使用することができます。)
を、私は抽象的な工場のいくつかの種類を想定してきました作成するには。一般的なメソッドでは、例外をスローしないような、引数を持たないpublicコンストラクタはありません。 H5N1と交差した豚インフルエンザのような反射は避けてください。代わりに、作成時に渡される適切な(抽象化固有の)抽象ファクトリを使用します。
public interface MySortOfFactory<
T /*extends SomeEntity*/,
A /*extends SomeInfo*/
> {
T create(A arg);
}
[2]:http://java.sun.com/javase/6/docs/api/java/util/concurrent/ConcurrentMap.html#putIfAbsent(K、V)
何* *エラーですか?私は推測していますが、あなたは明白になりますか? –
エラーは構文エラーです:メソッドの戻り値の型はVです。オブジェクト型を返そうとしています...これはエラーです – Saeed