请考虑以下结构
BaseModel.java -> 抽象基类
Company.java、Person.java -> 一些模型,继承自 < em>BaseModel.java
Context.java -> 存储所有模型的上下文类,可能如下所示:
public class Context
{
private Map<String, Company> companyModels = new HashMap<>();
private Map<String, Person> personModels = new HashMap<>();
public void addCompany(Company company)
{
companyModels.put(company.getCompanyName(), company);
}
public Company getCompany(String companyName)
{
return companyModels.get(companyName);
}
public void addPerson(Person person)
{
personModels.put(person.getPersonFullName(), person);
}
public Person getPerson(String personFullName)
{
return personModels.get(personFullName);
}
}
有时,例如创建人员时,我需要引用公司,这就是为什么我有公司和人员的 map 。
现在看起来没问题,但问题是,会有很多不同的模型,因此对于每个模型都需要一个映射,以及两种方法,一种将其添加到映射,另一种进行检索。
如何简化?
我在考虑枚举:
public enum ModelType
{
Company,
Person
}
在我的Context.java
中private Map<ModelType, Map<String, BaseModel>> models = new ConcurrentHashMap<>();
/**
* Retrieve some company details
*/
private void test()
{
String companyName = ((Company) models.get(ModelType.COMPANY).get("Some company name")).getCompanyName();
}
但如果可能的话,我宁愿避免选角,如有任何建议,我们将不胜感激。
最佳答案
在某种程度上,我同意@Turing85,你最好将你的映射分开,但是,如果你绝对需要,你可以使用类而不是额外的枚举类型:
public class Context {
private final Map<Class<?>,Map<String,Object>> classMap = new HashMap<>();
public void put(String name, Object obj) {
Map<String,Object> map = classMap.get(obj.getClass());
if (map == null) {
map = new HashMap<>();
classMap.put(obj.getClass(), map);
}
map.put(name, obj);
}
public <T> T get(String name, Class<T> clazz) {
Map<String,Object> map = classMap.get(clazz);
if (map == null) {
return null;
}
return clazz.cast(map.get(name));
}
}
关于Java模型,摆脱多个映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58234951/