【问题标题】:what does DefaultEdge.class mean in jgrapht exampleDefaultEdge.class 在 jgrapht 示例中是什么意思
【发布时间】:2015-06-10 07:48:20
【问题描述】:

传递给构造函数的参数中的点类是什么意思

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

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

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

【问题讨论】:

    标签: java parameters constructor jgrapht


    【解决方案1】:

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

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

    有多种可能的方法可以准确地完成此操作,但可以归结为调用Class#newInstance(),或者从给定的Class 获取Constructor 并调用Constructor#newInstance(...),传递给定的顶点作为参数。

    为回应评论而扩展:

    对于DefaultDirectedGraph 的特殊情况,边的创建是通过EdgeFactory 完成的——一个简单的Factory 从两个顶点创建边实例。这个工厂用在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),简单地告诉他:“每当我想添加新边时,就创建此边的新实例类。”

    【讨论】:

    • 差不多清楚了,你能把最后一段解释得详细一点吗
    • @ysaditya 稍微扩展了最后一部分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2017-06-11
    • 2018-03-05
    • 2023-03-27
    • 1970-01-01
    • 2013-10-27
    相关资源
    最近更新 更多