可以用Java控制对象的身份,如果是,如何控制?

amn*_*amn 7 java identity hashmap map

这是一个简单的编程问题.我不是Java专家.假设我使用自定义类Company和Employee的对象,方式与许多RDBMS示例的方式类似:

class Employee
{
    Company company;
}

class Company
{
    String name;
}
Run Code Online (Sandbox Code Playgroud)

我需要保证不同的Company对象具有唯一的名称 - 即没有两个这样的对象可能具有相同的名称,因为从我的角度来看它没有任何意义,也只是吃内存 - 如果两个员工在IBM工作,那么有一个单个Company对象name,期间.

我现在的想法是将Company构造函数设置为私有 - 以便将具有任意名称的公司对象分配的工作委托给受信任的方法 - 假设它将拒绝任何后续尝试创建具有已存在的名称的对象或返回现有的或新的对象(必要时创建一个).

问题是,我不确定如何优雅地完成这一任务.一件好事就是O(n)每次Company请求具有名称的对象时都不必进行查找- 所以为了方便我可能会使用哈希映射或二叉树吗?我还想覆盖Company识别对象的方式- 这导致我:我会覆盖Object.equals和/或Object.hashCode方法吗?

Tof*_*eer 8

看一下flyweight模式.

我会做的是:

// incomplete, but you get the idea hopefully
CompanyFactory
{
    private Map<String, Company> companies;

    public getCompany(final String name)
    {
        Company company;

        company = compaines.get(name);

        if(company == null)
        { 
            company = new Company(name);
            companies.put(name, company);
        }

        return (company);
    }
}
Run Code Online (Sandbox Code Playgroud)


Fab*_*eeg 4

您可以覆盖equalsandhashCode并将它们存储在HashMapor中HashSet

  • @Lie:还是你误会了。域类中的 hashCode 和 equals 仅用于识别“现有”重复项,但您希望“避免”创建重复项。唯一的方法是使用一个以名称为键的实例映射 - 这使得域类中的 hashCode 和 equals 变得不必要。 (2认同)