Java模型,摆脱多个映射

标签 java generics model

请考虑以下结构

BaseModel.java -> 抽象基类

Company.javaPerson.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/

相关文章:

java - Spring 启动 + Spring 安全 : how to suppress the basic auth form

c# - 如何给泛型施加对引用类型的约束?

arrays - 创建通用多路复用器

spring - 当 Spring 无法验证模型的 java.util.Date 字段时,如何显示用户友好的错误?

java - 为什么使用 Jersey 在 JSON 中用 @ 返回名称

java - 如何知道@RequestMapping的哪个参数被调用

Scala 将通用数字函数作为参数传递

python - Blender Python 模块导入

ruby-on-rails - 无法将图像解析为 URL : to_model delegated to attachment,,但 Rails 5.2 中附件为零

java - 数据结构课上的测验