传递整个对象与传递是否存在开销或性能问题 选项1和2中的原始值?。
[编辑:我的意思是说传递Java对象与原始类型的引用。从 @ T.J。克劳德,我知道这里没有性能问题,因为对象引用大小在两种情况下都是相同的。但是API设计风格/透视的中介,其中 选项是最好的吗? ]
我目前正在定义服务层。我更喜欢“Type 1”, 但如果'Type 2'对性能有好处,我会使用Type 2。
Class A {
User user = SomeClass.getUser("anUser");
B b = new B();
b.doSomeOperation(user); // option 1
b.doSomeOperation(user.getUserId()); // option 2
}
Class B {
// Type 1
public void doSomeOperation(User user){
// some work done by using user.getUserId()
// I do not really need whole user object now.
}
// Type 2
public void doSomeOperation(int userId){
// some work done by userId
}
}
答案 0 :(得分:15)
你永远不会在Java中传递“整个对象”。传递的是一个引用,大约是int
左右的大小。所以你传递的内容 - 对象引用或int
ID - 对函数本身的调用没有影响。
但是,传递对象引用意味着您可以直接对该对象执行操作,而传递该ID意味着如果您需要访问该对象,则需要通过ID再次查找它,这可能会对性能产生负面影响。
修改:根据您的更新:
我知道这里没有性能问题,因为在这两种情况下对象引用大小都相同。但是API设计风格/视角的中介,哪个选项最好?
这完全改变了问题(并且似乎完全放弃了“性能”部分)。
完全取决于A)您将在doSomeOperation
中做什么,以及B)doSomeOperation
的来电者最有可能拥有哪些信息。< / p>
如果doSomeOperation
需要的不仅仅是用户ID,那么当然要传入该对象。
如果doSomeOperation
除了用户ID之外不需要任何其他内容,那么您可能只想传入ID。有权衡。如果您只传入int
ID,则doSomeOperation
会失去与User
的耦合(这通常很好);另一方面,doSomeOperation
的论点变得毫无意义。 (int
可以是任何内容;但User
具有意义。)
如果doSomeOperation
采用User
参数但实际上只需要用户ID,则会给doSomeOperation
的来电者带来负担:如果他们只有ID,他们必须去查找对象仅仅是为了将它传递给doSomeOperation
(然后将忽略除ID之外的所有内容)。从表现的角度来看,这显然很糟糕。
所以我认为摘要是:如果doSomeOperation
要求User
以外的任何内容超出其ID,请传入User
。如果它只需要ID而且不需要User
中的任何其他内容,只需传入ID。
答案 1 :(得分:1)
如果您确定不需要除用户ID以外的任何其他信息,请转到type 2
,否则返回1.
更多的是你没有传递整个对象,只会复制引用的位。
假设您要更新用户doSomeOperation
中的某些信息,那么您将不得不使用费用较高的ID来获取该对象。
答案 2 :(得分:1)
从效果的角度来看,type1
和type2
之间没有显着差异。从设计的角度来看,有。
作为一般规则,只传递什么 需要,没有更多,也没有更少。
如果您传递对User
对象的引用,则doSomeOperation
将与User
课程相关联。这可能会在将来出现问题,例如难以对方法进行单元测试等。
答案 3 :(得分:0)
如果您已经有用户对象的实例传递那个。当你传递对象时,你只传递了一个ref而不是一块内存。如果传递了id,则必须从数据库中检索用户。这是开销。