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

时间:2011-03-09 06:07:18

标签: java interface service

传递整个对象与传递是否存在开销或性能问题 选项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
    }
}

4 个答案:

答案 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)

从效果的角度来看,type1type2之间没有显着差异。从设计的角度来看,有。

  

作为一般规则,只传递什么   需要,没有更多,也没有更少。

如果您传递对User对象的引用,则doSomeOperation将与User课程相关联。这可能会在将来出现问题,例如难以对方法进行单元测试等。

答案 3 :(得分:0)

如果您已经有用户对象的实例传递那个。当你传递对象时,你只传递了一个ref而不是一块内存。如果传递了id,则必须从数据库中检索用户。这是开销。