Что означает DefaultEdge.class в примере с jgrapht

Что означает точка в классе, передаваемом конструктору

Я использую jgrapht в первый раз. У меня есть этот вопрос

Что мы передаем конструктору класса DefaultDirectedGraph? Я имею в виду, что означает DefaultEdge.class? Внутри этого класса нет статического поля с таким именем. Я имею в виду то, что в действительности передается конструктору этого класса. Что там означает точка-класс?

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

1 ответ

Решение

Если вопрос касается только синтаксиса, вы можете обратиться к разделу Синтаксис.class сайта о получении объектов класса из документации Oracle. В общем DefaultEdge.class это объект, который представляет класс DefaultEdge, Это объект типа java.lang.Class и содержит информацию о самом классе - например, какие поля и методы этот класс содержит.

В этом случае это Class Объект используется внутренне, jgrapht, для создания экземпляров ребер. Когда Graph#addEdge(V,V) метод называется, это Class Объект будет использоваться внутри для создания ребра - в частности, для создания DefaultEdge пример.

Существуют различные возможные способы, как это можно сделать точно, но все сводится к Class#newInstance() или для получения Constructor из данного Class и ссылаясь Constructor#newInstance(...), передавая заданные вершины в качестве параметров.

Расширено в ответ на комментарий:

Для частного случая 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), чтобы просто сказать ему: "Всякий раз, когда я хочу добавить новое ребро, создайте новый экземпляр этого ребра".

Другие вопросы по тегам