DefaultEdge.class在jgrapht示例中的含义

时间:2015-06-10 07:48:21

标签: java parameters constructor jgrapht

在传递给构造函数

的参数中,dot类的含义是什么

我第一次使用jgrapht。我有这个问题

我们传递给DefaultDirectedGraph类的构造函数是什么? 我的意思是DefaultEdge.class是什么意思?该类中没有具有该名称的静态字段。我的意思是实际传递给该类的构造函数。点类意味着什么?

DirectedGraph<String, DefaultEdge> g =
            new DefaultDirectedGraph<String, DefaultEdge>(DefaultEdge.class);

1 个答案:

答案 0 :(得分:2)

如果问题仅针对语法,您可能需要参考oracle文档中有关Retrieving Class Objects的网站的 .class语法部分。通常,DefaultEdge.class是表示DefaultEdge 的对象。这是java.lang.Class类型的对象,包含有关类本身的信息 - 例如,此类包含的字段和方法。

在这种情况下,这个Class对象在内部由jgrapht使用,以便创建边缘实例。调用Graph#addEdge(V,V)方法时,将在内部使用此Class对象创建边缘 - 尤其是创建DefaultEdge实例。

有多种可能的方法可以完全实现,但它可以归结为调用Class#newInstance(),或从给定的Constructor获取Class并调用{{ 3}},将给定的顶点作为参数传递。

响应评论进行了扩展:

对于DefaultDirectedGraph的特定情况,边缘的创建是使用EdgeFactory完成的 - 一个简单的Constructor#newInstance(...),可以从两个顶点创建边实例。该工厂用于addEdge方法:

@Override public E addEdge(V sourceVertex, V targetVertex)
{
    ...
    E e = edgeFactory.createEdge(sourceVertex, targetVertex);
    ... 
}

EdgeFactory是在构造函数中创建的,来自给定的Class对象(可能是DefaultEdge.class,如示例所示):

public DefaultDirectedGraph(Class<? extends E> edgeClass)
{
    this(new ClassBasedEdgeFactory<V, E>(edgeClass));
}

反过来,ClassBasedEdgeFactory执行我已经提到的内容:它使用给定的Class对象来创建新实例:

public class ClassBasedEdgeFactory<V, E> implements EdgeFactory<V, E>, ...
{
    ...
    private final Class<? extends E> edgeClass;

    public ClassBasedEdgeFactory(Class<? extends E> edgeClass)
    {
        this.edgeClass = edgeClass;
    }

    ...    
    @Override public E createEdge(V source, V target)
    {
        try {
            return edgeClass.newInstance();
        } catch (Exception ex) {
            throw new RuntimeException("Edge factory failed", ex);
        }
    }
}

总而言之:可以将Class传递给图构造函数(例如,DefaultEdge.class),只需告诉他:“每当我想添加新边缘,然后创建一个新的这个边缘类的实例。“