sri*_*han 7 java service interface
传递整个对象与传递原始值是否存在开销或性能问题,如选项1和2中所示?
[编辑:我的意思是说传递Java对象与原始类型的引用.来自@TJ Crowder,我知道这里没有性能问题,因为两种情况下对象引用大小都相同.但是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
}
}
Run Code Online (Sandbox Code Playgroud)
T.J*_*der 15
你永远不会在Java中传递"整个对象".传递的是一个参考,大约是一个左右的大小int.因此,您传递的内容 - 对象引用或intID - 对函数本身的调用没有影响.
但是,传递对象引用意味着您可以直接对该对象执行操作,而传递该ID意味着如果您需要访问该对象,则需要通过ID再次查找它,这可能会对性能产生负面影响.
编辑:根据您的更新:
我知道这里没有性能问题,因为在两种情况下对象引用大小都相同.但是API设计风格/视角的中介,哪个选项是最好的?
这完全改变了问题(并且似乎完全放弃了它的"性能"部分).
这完全取决于A)你打算做什么的doSomeOperation,和B)什么样的信息呼叫者的doSomeOperation是最有可能.
如果doSomeOperation需要的不仅仅是用户ID,那么当然要传入对象.
如果doSomeOperation除了用户ID之外不需要任何其他内容,那么您可能只想传入ID.有权衡.如果你只传入一个intID,一方面doSomeOperation会失去它的耦合User(通常是好的); 另一方面,doSomeOperation论证变得毫无意义.(int可能是任何东西;但User有意义.)
如果doSomeOperation接受一个User参数但实际上只需要用户ID,那么你就会给调用者带来负担doSomeOperation:如果他们只有ID,他们必须只是为了传递它而查找对象doSomeOperation(然后就是忽略除ID之外的一切).从性能角度来看,这显然很糟糕.
所以我认为摘要是:如果doSomeOperation需要任何User超出其ID的内容,请传入User.如果它只需要ID并且不需要任何其他内容User,只需传入ID即可.