Java图形注释属性模式
我有一个带有节点的图形对象。 我需要有注释对象,它为每个节点保存任意属性。通常,如果一个节点具有T类型的属性,那么所有其他节点都将具有该类型的属性。 然后,Annotator对象将向注释添加特性。这使我的图形不可知。 有一些代码用于将特定类型的属性添加到节点,还有一些代码用于按类型检索属性 以下是我当前在注释类中拥有的代码:Java图形注释属性模式,java,dictionary,generics,properties,annotations,Java,Dictionary,Generics,Properties,Annotations,我有一个带有节点的图形对象。 我需要有注释对象,它为每个节点保存任意属性。通常,如果一个节点具有T类型的属性,那么所有其他节点都将具有该类型的属性。 然后,Annotator对象将向注释添加特性。这使我的图形不可知。 有一些代码用于将特定类型的属性添加到节点,还有一些代码用于按类型检索属性 以下是我当前在注释类中拥有的代码: private Map<Class<? extends Property>, Map<Node, Property>> properti
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);
}
private Map根据您当前的描述,我相信属性映射是您可能拥有的最佳解决方案
但是,由于您已经有了类
实例,因此可以使用它执行强制转换以消除警告(没有显式的SuppressWarnings
注释)
它将得到如下结果:
return clazz.cast(properties.get(clazz));
如果您想要针对NullPointerException
s提供额外的保护层,您可以将其更改为:
return clazz.cast(properties.getOrDefault(clazz, Collections.emptyMap()).get(node));
public <T extends Property> T getProperty(Node node, Class<T> clazz) {
return clazz.cast(properties.getOrDefault(clazz, Collections.emptyMap()).get(node));
}
这将使完整的getProperty
方法类似于:
return clazz.cast(properties.getOrDefault(clazz, Collections.emptyMap()).get(node));
public <T extends Property> T getProperty(Node node, Class<T> clazz) {
return clazz.cast(properties.getOrDefault(clazz, Collections.emptyMap()).get(node));
}
谢谢,我会改进的!