2014-10-03 43 views
1

我正在设计我的Web应用程序的服务层。我需要根据产品获得订单。Java API设计 - 按对象传递或按值传递

当我设计API时,是否应该按对象或值传递?

Order order = new Order(); 
String orderId = "1"; 
order.setId(orderId); 

List<Product> products = getProductByOrder(order); 

List<Product> products = getProductsByOrderId(orderId) 
+7

这些术语意味着完全不同的东西。你可能想澄清。 – 2014-10-03 14:40:36

+0

为什么不都有,因为一个是从另一个派生出来的? (这里主要是魔鬼的拥护者,我不知道额外的表面区域是否值得。) – 2014-10-03 14:42:18

+0

如果是我我会有一个映射其中String是orderId,然后获取order/orderId(取决于你想要显示什么)通过使用orderID。 – nafas 2014-10-03 14:43:55

回答

3

嗯,我觉得你在做一些错误与此概念中,你正在为这个目标,秩序和订单ID引用这两种方式(因为字符串是一个对象了。)

但最好的方法这种情况下使用getProductsByOrderId(orderId),因为你的代码将松散耦合,因为你的其他层不必知道一个Order对象,并只知道一个字符串对象。如果我们可以传递更简单的对象作为参数,我们可以。

从@Pienterekaak很好的例子张贴评论:

“在许多情况下,它更容易获得只是一个订单ID,那么整个订单的对象(例如,您将包括订单ID在REST调用,不是整个订单对象)“

+0

但它必须知道一个orderid,这是订单的一部分。 Imo在Order类中实现它会更好,因此您可以调用List order这样的属性。产品 – Nicolas 2014-10-03 14:47:42

+1

这比仅传递订单的效率要低。因为现在你必须根据id查找订单。额外的处理。如果您只是给订单本身的指针,那么就没有查找。 – brso05 2014-10-03 14:49:22

+0

这就是要点,如果我通过orderid,接收的方法不需要知道它是订单对象的一部分。如果我们可以传递更简单的对象作为参数,我们可以。顺便说一句,好点@ brso05 - 直到你的评论 – 2014-10-03 14:51:14

1

从我的经验,我会去的:

List<Product> products = getProductsByOrderId(orderId) 

有了说法,对于第一个呼叫,您需要一个Order对象,并为第二个电话,你只需要一个ID号,很容易获得。

1

其实这些都是传递的价值。 Java只能通过价值传递。在这两种情况下,您都传递对象(字符串)或(订单)的引用。您传递的值是该对象所在的内存位置(指针)。如果你传递的是像int这样的基本类型,它会传递类似1的值,但是如果你正在传递一个对象,它会将指针的值传递给对象ie。内存位置。无论如何,你总是在传递价值。

如果您有一个存储Order对象的Map,那么传递Object本身实际上会更高效,因为您直接传递该对象的指针。如果你传递的字符串ID为1,你传递一个指向该字符串的指针,那么你将不得不使用该字符串来查找你的Order对象,它实际上是添加更多的处理,然后直接传递一个指向对象的指针。

+0

你已经考虑过一个他们有'Map '的案例。其他情况呢?如果他们有'Map ',怎么办? – 2014-10-03 14:53:03

+0

在行之间阅读有时你必须根据OP的要求推断事情......我只是根据他的要求给了他一个例子。 – brso05 2014-10-03 14:57:38

+2

我不知道你在说什么线路。你只是在考虑一种可能性而批评另一个答案,但在你的答案中做同样的事情。 – 2014-10-03 15:06:45

0

OrderId属于订单的概念。如果您传递订单ID,则产品必须知道订单如何识别。这不是松散耦合的。

如果你把方法变为有序,所以你可以调用像 列表order.Products 只有等级的概念都知道,产品和订单是如何连接的,这听起来我的权利属性。 产品不应该知道任何关于订单,但订单应该知道产品。

如果您使用Hibernate,您可以将它配置为使用一对多来完成它,因为orderId是订单表中的主键。