У меня есть график (г), который использует строитель (стиль J Bloch). График необходимо перевернуть для запуска определенной статистики, которая затем кэшируется для доступа к отчетам и алгоритмам анализа.
Итак, график g определяет следующие ссылочные переменные:
private final Builder savedBuilder; // save builder for clone build with same properties.
private final Graph gPrime; // must reverse populated graphs BEFORE cache of stats
Примечание: gPrime относится к идентичному графику, за исключением того, что он заполнен из явного g.
gPrime.gPrime должен ссылаться на g, так как g - обратная сторона gPrime.
и метод сборки компоновщика:
public Graph build() {
Graph g = new Graph(this);
g.gPrime.gPrime = g;
return g;
}
и конструктор, который берет строителя:
private Graph (Builder builder){ // 'this' used for clarity
this.gType = builder.gType;
this.dropOrphans = builder.dropOrphans;
this.fileHandle = builder.fileHandle;
this.nodes = builder.nodes;
this.edges = builder.edges;
this.delimiter = builder.delimiter;
this.mapCapacity = builder.mapCapacity;
this.mapLoadFactor = builder.mapLoadFactor;
this.savedBuilder = builder; // save builder for cloning
emptyGraph(); // build empty structure for data in this graph
if (this.fileHandle == null) { // no file data
if (this.nodes == 0) { // no sizing info
; // nothing else to do - - - empty graph
} else { // we have # of nodes
if ( this.edges == 0) { // just an edge-less integer graph)
populateEdgeless(nodes) ;
} else { // randomly generated graph
populateRandom(nodes, edges);
}
}
} else { // populate from file
populateFromFile();
}
// To create empty graph to transpose our values into,
// we need to clear out builder settings that would populate a new graph.
savedBuilder.fileHandle = null;
savedBuilder.nodes = 0;
savedBuilder.edges = 0;
// otherwise, everything the same, so just pass modified builder to constructor
// save the reference to this graph ( ready for the reversal method to use )
this.gPrime = new Graph(savedBuilder);
)
Еще раз. Цель состоит из двух графических объектов, каждый из которых ссылается на gPrime.
Последовательность:
построить g - - - заполнить g - - - превратить g в пустой граф с теми же характеристиками, что и g
Итак, вот проблема, которую я не совсем понимаю.
Если я назначу g для gPrime.gPrime, либо в сборке после сборки g us, либо в нижней части конструктора, я получу сообщение об ошибке, указывающее, что gPrime является окончательным. Затмение указывает, что это первый gPrime, о котором идет речь, - - что является правдой - - он является окончательным и был назначен. Но gPrime.gprime (с акцентом на второй gPrime) еще не назначен. (Я искал всю программу.)
Я также попытался поместить назначение в конец обратного метода. То же самое.
Я также попробовал g.gPrime.gPrime в компоновщике. То же самое.
Это почти как если бы компилятор не понимал, какой gPrime получает назначение.
Я уверен, что есть что-то, чего я не вижу или не понимаю - - - но - - - - не знаю, как это сделать.
Я могу сделать эту работу, если вычеркну финал, но я пытаюсь добраться до неизменности.