再帰問題の解決策が思いつかないようです。したがって、依存している他のバージョン オブジェクトへの参照のリストを保持するこの Version オブジェクトがあります。
バージョン
{
"id": "id1",
"version": "1",
"dependencies": [
{
"id": "id2"
},
{
"id": "id3"
}
]
}
このオブジェクトを取得するときは、最終的に終了するまで、その依存関係と依存関係の依存関係も取得する必要があります。これは次のようになります。
バージョンDto
{
"id": "id1",
"version": "1",
"dependencies": [
{
"id": "id2",
"version": "2",
"dependencies": [
{
"id": "id4",
"version": "4",
"dependencies": []
}
]
},
{
"id": "id3",
"version": "3",
"dependencies": []
}
]
}
これは、バージョンを取得するための再帰関数です
public VersionDto getVersion(String id)
{
//Retrieves from database
Version version = versionDAO.getVersion(id);
//Convert to Dto (basic fields)
VersionDto versionDto = new VersionDto(version);
//Recursivly retrieve dependencies
for (Map<String, String> dep : version.getDependencies()) {
VersionDto dto = new VersionDto();
//Recursive call
dto = getVersion(dep.get("id"));
versionDto.getDependencies().add(dto);
}
return versionDto;
}
ただし、バージョンが v1 -> v2 -> v4 -> v1 のようにネストされた依存関係の 1 つに依存し、無限の繰り返しが発生する可能性がある場合、無限ループの可能性の問題に遭遇します。
この無限ループをどのように解決して防ぐことができるので、以前にすべての準備が整ったバージョンが発生した場合、それをスキップする必要がありますか?
編集:グローバルリストを使用したソリューション
public VersionDto getVersion(String id)
{
//Check global list contains version
if (visited.contains(id)) {
return null;
}
visited.add(docId);
//Retrieves from database
Version version = versionDAO.getVersion(id);
//Convert to Dto (basic fields)
VersionDto versionDto = new VersionDto(version);
//Recursivly retrieve dependencies
for (Map<String, String> dep : version.getDependencies()) {
VersionDto dto = new VersionDto();
//Recursive call
dto = getVersion(dep.get("id"));
if(dep!= null) {
versionDto.getDependencies().add(dto);
}
}
return versionDto;
}