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