传递整个对象与传递原始值 -

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即可.