Передача всего объекта в сравнении со значением Passing Primitive - - PullRequest
7 голосов
/ 09 марта 2011

Есть ли издержки или проблемы производительности при передаче всего объекта по сравнению с передачей примитивное значение как в варианте 1 и 2?.

[РЕДАКТИРОВАТЬ: я хотел сказать, передавая ссылку на объект Java против примитивного типа. От @ T.J. Краудер, я понимаю, что здесь нет проблем с производительностью, так как размер ссылки на объект одинаков в обоих случаях. Но интерфейс API стиля дизайна / перспективы, которая вариант самый лучший? ]

В настоящее время я определяю уровень обслуживания. Я предпочитаю «Тип 1», как мне нравится, но если «Тип 2» хорош для производительности, я пойду с Типом 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 ]

15 голосов
/ 09 марта 2011

Вы никогда не передадите «весь объект» в Java.То, что передается, является ссылкой, размером примерно с int или около того.То, что вы передаете - ссылка на объект или int ID - не влияет на производительность с точки зрения вызова самой функции.

Однако передача ссылки на объект означает, что вы можете действовать непосредственно наобъект, в то время как передача идентификатора означает, что если вам нужен доступ к объекту, вам нужно снова найти его по идентификатору, что может оказать негативное влияние на производительность.


Редактировать : На основании вашего обновления:

Я понимаю, что здесь нет проблем с производительностью, так как размер ссылки на объект одинаков в обоих случаях.Но что касается стиля / перспективы дизайна API, какой вариант является лучшим?

Это полностью меняет вопрос (и, кажется, полностью отбрасывает часть «производительности»).

Это полностью зависит от A) Что вы будете делать в doSomeOperation, и B) Какую информацию, скорее всего, будут иметь абоненты из doSomeOperation.

Если doSomeOperation потребуется больше, чем просто идентификатор пользователя, затем, конечно, передайте объект.

Если doSomeOperation не нужно ничего, кроме идентификатора пользователя, то вы, вероятно, хотите просто передатьв удостоверении личности.Есть компромиссы.Если вы передаете только int ID, с одной стороны, doSomeOperation теряет связь с User (что обычно хорошо);с другой стороны, аргумент doSomeOperation становится в значительной степени бессмысленным.(int может быть чем угодно; но User имеет значение.)

Если doSomeOperation принимает аргумент User, но на самом деле нужен только идентификатор пользователя, вы обременяете вызывающих абонентовdoSomeOperation: Если у них просто есть идентификатор, они должны искать объект исключительно с целью передачи его в doSomeOperation (который затем будет игнорировать все, кроме идентификатора).Это явно плохо с точки зрения производительности.

Итак, я думаю, что сводка такова: если для doSomeOperation требуется что-то из User, кроме его идентификатора, передайте User.Если ему нужен только идентификатор и ничего не нужно от User, просто передайте идентификатор.

1 голос
/ 09 марта 2011

С точки зрения производительности, между type1 и type2 нет существенной разницы.С точки зрения дизайна есть.

Как правило, передайте только то, что нужно, не больше и не меньше.

Если вы передаете ссылку наобъект User, который doSomeOperation будет связан с классом User.Это может привести к проблемам в будущем, таким как трудности в модульном тестировании метода и т. Д.

1 голос
/ 09 марта 2011
  • , если вы уверены, что не понадобится какая-либо другая информация, кроме просто идентификатора пользователя, тогда выберите type 2, иначе 1.

  • более того, вы не передаете весь объект, просто будут скопированы биты ссылки.

  • предположим, что вы хотите обновить некоторую информацию в doSomeOperation пользователя, тогда вам придетсяполучить этот объект, используя идентификатор, который будет дорогостоящим.

0 голосов
/ 09 марта 2011

Если у вас уже есть экземпляр объекта пользователя, передайте его.Когда вы передаете объект, вы передаете только реф, а не кусок памяти.Если вы передадите идентификатор, вам, вероятно, придется извлечь пользователя из базы данных.это накладные расходы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...