Java图形注释属性模式

Java图形注释属性模式,java,dictionary,generics,properties,annotations,Java,Dictionary,Generics,Properties,Annotations,我有一个带有节点的图形对象。 我需要有注释对象,它为每个节点保存任意属性。通常,如果一个节点具有T类型的属性,那么所有其他节点都将具有该类型的属性。 然后,Annotator对象将向注释添加特性。这使我的图形不可知。 有一些代码用于将特定类型的属性添加到节点,还有一些代码用于按类型检索属性 以下是我当前在注释类中拥有的代码: private Map<Class<? extends Property>, Map<Node, Property>> properti

我有一个带有节点的图形对象。 我需要有注释对象,它为每个节点保存任意属性。通常,如果一个节点具有T类型的属性,那么所有其他节点都将具有该类型的属性。 然后,Annotator对象将向注释添加特性。这使我的图形不可知。 有一些代码用于将特定类型的属性添加到节点,还有一些代码用于按类型检索属性

以下是我当前在注释类中拥有的代码:

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));
}

谢谢,我会改进的!