我正在设计我的Web应用程序的服务层。在某些情况下,我需要根据产品获得订单。
当我设计API时,我应该通过对象还是值传递?
Order order = new Order();
String orderId = "1";
order.setId(orderId);
List<Product> products = getProductByOrder(order);
List<Product> products = getProductsByOrderId(orderId)
答案 0 :(得分:3)
嗯,我认为你在这个概念上犯了一些错误,在这两种方式中你引用了这个对象,order和orderId(因为String也是一个对象。)
但在这种情况下,最好的方法是使用getProductsByOrderId(orderId)
,因为你的代码将松散耦合,因为你的其他层不必知道Order
对象,只知道一个字符串对象。如果我们可以将更简单的对象作为参数传递,我们就可以了。
来自@Pienterekaak的好例子发表评论:
&#34;在许多情况下,更容易获得一个orderid,然后是整个订单对象。 (例如,您将在REST调用中包含订单ID,而不是整个订单对象)&#34;
答案 1 :(得分:1)
根据我的经验,我会选择:
List<Product> products = getProductsByOrderId(orderId)
使用参数,对于第一个调用,您需要一个Order对象,而对于第二个调用,您只需要一个id,这在概率上更容易获得。
答案 2 :(得分:1)
实际上这两个都是通过价值传递的。 Java只按值传递。在这两种情况下,您都传递对Object(String)或(Order)的引用。您将作为值传递此对象所在的内存位置(指针)。如果你传递像int这样的基本类型,它会传递像1这样的值但是如果你传递一个对象,它会将指针的值传递给对象,即。记忆位置。无论如何,你总是在路过价值。
如果你有一个存储Order对象的Map,那么传递Object本身实际上更有效,因为你直接传递了该对象的指针。如果传递String id为1,则传递指向该字符串的指针,那么您必须使用该字符串查找Order对象,这实际上是添加更多处理,然后直接将指针传递给对象。
答案 3 :(得分:0)
OrderId属于订单的概念。如果您传递订单ID,则产品必须知道如何识别订单。那不是松耦合的。
如果您将方法置于Order中,那么您可以调用类似的属性 清单order.Products 只有订单概念知道,产品和订单是如何连接的,这对我来说是正确的。 产品不应该对订单有任何了解,但订单应该了解产品。
如果你使用Hibernate,你可以配置它为你做一对多,因为orderId是你的订单表中的主键。