【问题标题】:Associate one and only one object关联一个且仅一个对象
【发布时间】:2021-09-17 08:52:21
【问题描述】:

您好,我有一个问题。

我有 A 类和 B 类。我创建了一个对象 A 和多个对象 B。但我希望只有一个 B 可以与 A 一起设置。 例如

class A{} 
class B{ private A a;}
public static void main(String[] args){
     A a= new A();
     B b= new B();
     B c= new B();
     b.setA(a);
     c.setA(a);//Sould not assign it.
}

【问题讨论】:

  • 你能不能更清楚地解释一下'我只想要一个B可以和A'
  • @AKSingh 更好的是一个 A 只有一个 B。因为一个 b 可以用 A 为 b.set(a) 和 c.set(a) 设置。两者都设置了一个 A。
  • 你不能在 Java 中做到这一点。您正在创建(类蓝图 B)的对象,它允许使用 .setA()。如果你创建一个 new B() 的实例,它总是可以说 .setA()
  • @SusanMustafa 究竟是数据库作业如何返回错误? e.x JPA 可以进行检查吗?
  • 您需要向@george 显示更多代码,说明您想要什么/如何。

标签: java associations one-to-one


【解决方案1】:

这是实现这一概念的一种方法。


代码

class A {}

public class B
{
    private static final HashSet<A> setA = new HashSet<>();
    private A a;

    public void setA(A a)
    {
        if (!setA.contains(a))
        {
            this.a = a;
            setA.add(a);
        }
    }

    public A getA() { return a; }

    public static void main(String[] args)
    {
        A a0 = new A();
        A a1 = new A();

        B b0 = new B();
        B b1 = new B();
        B b2 = new B();

        b0.setA(a0);
        b1.setA(a1);
        // Below two operations fail silently
        b2.setA(a0);
        b2.setA(a1);

        System.out.println(b0.getA());
        System.out.println(b1.getA());
        System.out.println(b2.getA());
    }
}

您甚至可以抛出自定义异常,而不是静默失败。


输出

george_17092021_1434.A@568db2f2
george_17092021_1434.A@378bf509
null

结论

这样做应该有助于实现您想要的。但是,我不知道这是否适合专业使用。如果您遇到任何问题,请发表评论。

【讨论】:

  • 感谢您的评论class B{ private static List&lt;A&gt; hasA= new ArrayList&lt;&gt;(); private A a; public void setA(A a){ if(!hasA.contains(a)){ this.a=a; this.hasA.add(a); } }
  • 我建议使用HashSet。当您使用添加、删除和包含操作时,它提供恒定时间性能。我已经更新了我的答案。
  • 为什么HashSet比List好?我的意思是如何在没有搜索谷歌的情况下得出这个结果。
  • ArrayList 相比,HashSet 的添加、删除和包含操作非常快。在提供的代码中,containsadd 操作将被大量使用,因此 HashSet 是更好的选择。我已经和他们两个一起工作过。因此,我没有任何谷歌搜索就知道了:)
猜你喜欢
  • 2017-02-14
  • 1970-01-01
  • 2012-03-21
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多