我有一些输入,例如:
package 1 : org.orchestr.something version= 5.1.3
uses = org.do.resource ; version= 1.2.1
uses = org.test.summer ; version= 1.5.2
package 2 : fr.test.something version= 5.1.3
uses = com.java.rest ; version= 1.0.1
uses = org.osgi.summer ; version= 1.4.2
....
因此在此数据中,我有一组由其版本定义的软件包,以及一堆在特定版本中使用的其他软件包,我想知道的是存储此类数据的最佳方法/实用方法。
答案 0 :(得分:0)
听起来您打算表示一些类似结构的图形。
第一个幼稚的实现可能/将使用特定的类,例如Package
和Entry
,其中Package可能具有Entry
对象的列表/集合(而Entry具有一个名称+版本字符串)。
当然,由于最终打算创建某种图形,因此您可能也应该研究诸如graphql之类的解决方案。
答案 1 :(得分:0)
假设您的案例中存在一层嵌套的依赖项,则类似的事情可能会起作用:
Artifact
基类:
class Artifact {
protected String name;
protected String version;
public Artifact(String name, String version) {
this.name = name;
this.version = version;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
}
扩展Package
并添加另一个参数Artifact
的{{1}}类:
uses
然后可以根据需要将其存储为class Package extends Artifact {
public Package(String name, String version, List<Artifact> uses) {
super(name, version);
this.uses = uses;
}
private List<Artifact> uses;
public List<Artifact> getUses() {
return uses;
}
public void setUses(List<Artifact> uses) {
this.uses = uses;
}
}
或List
。
在Map
中使用的示例:
Map
答案 2 :(得分:0)
该包和使用的数据看起来相等。所以我会用地图:
class Uses { private path, version; }
Map<Uses, Set<Uses>> data;
包是键,使用的依赖项是值的元素。
答案 3 :(得分:0)
您可以将其建模为工件图:
import java.util.Objects;
public class Artifact {
private String name;
private String version;
public Artifact(String name, String version) {
this.name = name;
this.version = version;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Artifact that = (Artifact) o;
return version.equals(that.version) &&
name.equals(that.name);
}
@Override
public int hashCode() {
return Objects.hash(version, name);
}
}
这是这个的用法:
public static void main(String[] args) {
Map<Artifact, Set<Artifact>> map = new HashMap<>();
Set<Artifact> dependencies = new HashSet<>();
dependencies.add(new Artifact("org.do.resource ", "1.2.1"));
dependencies.add(new Artifact("org.test.summer ", "1.5.2"));
map.put(new Artifact("org.orchestr.something", "5.1.3"), dependencies);
}
我必须为equals
类重写hashcode
和Artifact
方法,因为此类的对象将用作HashMap
中的键。
如果您还希望支持软件包版本,只需将此类字段添加到Artifact
类中,并添加适当的构造函数,getter,setter并相应地修改equals
和hashcode
方法。