Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过给定的类图在Java OOP代码中正确实现关联?_Java_Oop_Uml - Fatal编程技术网

如何通过给定的类图在Java OOP代码中正确实现关联?

如何通过给定的类图在Java OOP代码中正确实现关联?,java,oop,uml,Java,Oop,Uml,我很困惑如何在java代码中正确实现,在UML类图上绘制关联 假设我们只有两个类(即Order和Product)以不同的方式指定关联, 这些关联可归纳为以下情况A、B或C: 既然我找到了这个答案: 这涉及(与箭头和适航方向的关联) 我的第一个问题是关于实现B和实现A的区别。 关于实现,我将写下: public class Order{ private Set<Product> products; } public class Product{ privat

我很困惑如何在java代码中正确实现,在UML类图上绘制关联

假设我们只有两个类(即Order和Product)以不同的方式指定关联, 这些关联可归纳为以下情况A、B或C:

既然我找到了这个答案: 这涉及(与箭头和适航方向的关联)

我的第一个问题是关于实现B和实现A的区别。 关于实现,我将写下:

public class Order{
     private Set<Product> products; 
}


public class Product{
     private Set<Order> orders; 
}

一个订单有几个产品,所以将产品集合到订单中似乎是正确的

另一方面,Product的一个实例应该只与一个订单关联。可能有一种ProductModel在多个产品之间共享,但是一个Product实例应该只链接到一个订单。因此,这里不需要更多的收集,也不需要更多的链接,因为我们已经在订单和这些产品之间建立了链接

所以B的实现似乎还可以


对于第二个问题,即C实现,您应该拥有一个具有4个插槽的数组或一个大小不限的集合。在这两种情况下,都必须添加代码来控制添加或删除元素时的状态。例如,在接受添加新产品之前,请检查订单是否还没有4个产品,并正确处理该情况。

关于您的问题C

可以通过以下方式获得固定大小的列表:

public class Order {
     private List<Product> products = Arrays.asList(new Product[4]); 
}
公共类秩序{
私有列表products=Arrays.asList(新产品[4]);
}
查看此示例(请不要介意public属性,我只是懒得在这个简短的示例中编写setter方法)

代码:

import java.util.*;
导入java.lang.*;
导入java.io.*;
类产品{
}
阶级秩序{
public List products=Arrays.asList(新产品[4]);
}
/*只有当类是公共的时,类的名称才必须是“Main”*/
班长
{
公共静态void main(字符串[]args)引发异常
{
订单o=新订单();
o、 products.set(0,新产品());
系统输出打印LN(o.产品);
o、 products.add(new Product());//抛出UnportedOperationException
}
}

好的,虽然问多个问题不是一种好的方式,但这里是对A/B的一个回答。引入导航功能只有很少的语义。它告诉您必须能够沿箭头方向导航。因此,原始类具有关联所指向的类的属性。但在大多数情况下,从设计模型(从实现的方法)可以明显看出,哪一方需要另一方的属性。这样你就可以毫无问题地离开它了


话虽如此,两种实现都从纯“箭头上下文”实现了设计。需要
私人设置订单源于整个系统设计。如果你不使用
私有集合产品,那就错了在B案例中。

您的型号A只指定了
订单
产品
之间的多对多关联。它还没有指定如何在引用属性的帮助下实现此关联:作为单向关联还是作为双向关联

您的模型B可能旨在表达
订单
产品
之间的单向多对多关联,该关联以参考属性
订单::产品
的形式实现。然而,这需要不同的视觉符号,因为UML导航性箭头没有太多的语义(它们并不意味着引用属性,但也可以由相关产品的基于查询的检索方法来处理)。您必须将箭头替换为“关联结束所有权”点,如中所述

您的模型C只是添加了一个较高的多重性约束,这意味着您必须阻止用户对同一产品进行第五次订购。使用Java Bean注释,可以将此约束表示为:

@Size(max=4) Set<Product> products;
@Size(max=4)套装产品;

您可能想在我的中了解更多信息。

注意:我不是问A是否优于B。订购产品只是作为一个示例,将它们作为具有关系的两个实体。重点不在于订购的产品数量是否正确,反之亦然。这个关系可以表示为A图或B图。我想了解的是,B实现是否因为添加了箭头而满足B图。我认为A和B的意思是相同的,即箭头隐含在A中,该顺序包含产品。因此,您的第一个实现是错误的(双向引用)。第二个是正确的。关于C,在没有更多信息的情况下很难说出发生了什么。A和B显然不是同一个意思。如果关联实现为双向关联(如问题中所建议的)或单向关联(如B中所示),则A将其保留为打开状态。请看下面我的答案。请参阅我的问题补充说明。关于A/B。如果我不清楚,很抱歉,但这不是正确实现的点图是的。。。但在现实生活中,我们并不是为了取乐而画那么多的图表,图表是通过反映一个真实的具体情况来绘制的,根据具体情况,只有一个图表才是真正合乎逻辑的。但是是的,您的代码反映了您的图表;)我同意你的看法,这只是一个“学术”问题,而不是现实生活。请注意,这是一个可能的实现,但也有其他的。您还可以添加一个类,该类的角色是管理两个对象之间的链接。根据具体情况(也可能取决于开发人员),可能会选择一种或另一种实现方式来实现该目的。术语“产品”模糊地用于单个产品和产品类型。这也是问题中类产品的预期含义。我明白了,
public class Order {
     private List<Product> products = Arrays.asList(new Product[4]); 
}
import java.util.*;
import java.lang.*;
import java.io.*;

class Product {

}

class Order{
     public List<Product> products = Arrays.asList(new Product[4]); 
}

/* Name of the class has to be "Main" only if the class is public. */
class Main
{
    public static void main (String[] args) throws Exception
    {
        Order o = new Order();
        o.products.set(0, new Product());
        System.out.println(o.products);
        o.products.add(new Product()); // throws UnsuportedOperationException
    }
}
@Size(max=4) Set<Product> products;