2015-06-10 29 views
1

是什么点类意味着通过什么DefaultEdge.class意味着jgrapht例如

我使用jgrapht首次来构造函数的参数。我有这个问题

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

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

回答

2

如果问题只针对语法,你可能想请参考该网站的的.class语法有关从Oracle文档Retrieving Class Objects。通常,DefaultEdge.class是表示类别DefaultEdge的对象。这是类型为java.lang.Class的对象,并且包含有关类本身的信息 - 例如,此类包含哪些字段和方法。

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

有各种可能的方式如何,可以准确地完成,但它要么归结为调用Class#newInstance(),或从给定的Class获得Constructor和调用Constructor#newInstance(...),通过给定的顶点作为参数。

响应注释扩展: - 一个简单的Factory从两个顶点创建边缘情况下

对于DefaultDirectedGraph的特殊情况下,边缘的创建与EdgeFactory完成。这个工厂在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),简单地告诉他:“每当我想添加一个新的边缘,然后建立这个边缘类的新实例。 “

+0

差不多你能解释一下最后一段多细细点 –

+1

@ysaditya最后一段扩展了一下 – Marco13

+0

完全清楚了!!! –