2017-06-27 9 views
0

ノードを持つGraphオブジェクトがあります。 各ノードの任意のプロパティを保持するアノテーションオブジェクトを用意する必要があります。一般に、1つのノードがT型のプロパティを持つ場合、他のすべてのノードはその型のプロパティを持ちます。 Annotatorオブジェクトは、アノテーションにプロパティを追加します。これは私のグラフにとらわれないままです。 ノードに特定の種類のプロパティを追加するコード、種類別にプロパティを取得するコードがあります。ここでJavaグラフの注釈プロパティーパターン

私は現在、私の注釈クラスを持っているコードです:

private Map<Class<? extends Property>, Map<Node, Property>> properties; 

@SuppressWarnings("unchecked") 
public <T extends Property> T getProperty(Node node, Class<T> clazz) { 
    if (properties.containsKey(clazz)) { 
     return null; 
    } 
    return (T) properties.get(clazz).get(node); 
} 

public void addProperty(Node node, Property property) { 
    if (!properties.containsKey(property.getClass())) { 
     properties.put(property.getClass(), new HashMap<>()); 
    } 

    properties.get(property.getClass()).put(node, property); 
} 

私は、これが正常に動作信じて、しかし、ジェネリック医薬品は、彼らはおそらくかもしれないほど厳格ないないようです。 もっとエレガントなパターンがありますか?

ありがとうございました!

答えて

0

私は、あなたの現在の記述を考慮すると、プロパティマップがあなたがもっている可能性が最も高い回避策であると信じています。

Classインスタンスがすでに存在するため、キャストを実行して(明示的なアノテーションなしで)警告を取り除くことができます。

それはこのようなものになるだろう:これはgetPropertyあなたの完全なるだろう

return clazz.cast(properties.getOrDefault(clazz, Collections.emptyMap()).get(node)); 

:あなたはNullPointerException Sに対する追加の保護を望んでいた場合は、のようなものにそれを変更することができ

return clazz.cast(properties.get(clazz)); 

を方法は次のようになります。

public <T extends Property> T getProperty(Node node, Class<T> clazz) { 
    return clazz.cast(properties.getOrDefault(clazz, Collections.emptyMap()).get(node)); 
} 

キャストが有効でない場合、Class.cast()を使用する明示的キャストのようにClassCastExceptionがスローされることに注意してください。

また、あなたの引数を検証することを忘れないでください:

public <T extends Property> T getProperty(Node node, Class<T> clazz) { 
    Objects.requireNonNull(node); 
    Objects.requireNonNull(clazz); // Or inline them in the return, albeit not so readable 
    return clazz.cast(properties.getOrDefault(clazz, Collections.emptyMap()).get(node)); 
} 
+0

おかげで、病気それらの改善を行います! –