Лучше ли создать новый объект и вернуть его или создать новый объект в операторе возврата? - PullRequest
6 голосов
/ 25 февраля 2010

Например:

public Person newPerson() {
  Person p = new Person("Bob", "Smith", 1112223333);
  return p;
}

вместо:

public Person newPerson() {
  return new Person("Bob", "Smith", 1112223333);
}

Является ли один более эффективным, чем другой?

Ответы [ 6 ]

17 голосов
/ 25 февраля 2010

Нет никакой разницы, которая заставила бы вас выбирать одно из другого с точки зрения производительности.

  • Ради отладки первое лучше, т. Е. Когда вы хотите отследить выполнение или записать некоторую информацию между созданием и возвратом.
  • Ради удобочитаемости (но это субъективно) - последнее лучше.

В общем, я бы советовал для последнего, и всякий раз, когда вам нужно отладить это, сделайте временный переход на первый (двухстрочный) вариант.

8 голосов
/ 25 февраля 2010

Присвоение временной переменной перед возвратом дает вам возможность проверять и исправлять ошибки из вашего newPerson (). Для возврата нового вызова требуется, чтобы вызывающая сторона вашего метода newPerson () перехватывала и исправляла ошибки.

1 голос
/ 25 февраля 2010

В нормальном мире они будут компилироваться в один и тот же байт-код, поэтому они идентичны с точки зрения производительности. Тогда единственное отличие для людей:

Создание временной переменной немного облегчает отладку: вы можете поставить точку останова в операторе возврата и проверить значение p. В однострочной версии это сделать сложнее.

Выполнение в одну строку исключает переменную, снижает сложность, делает код немного легче для чтения.

На практике я написал бы это одной строкой, и в худшем случае я создал бы временную переменную, если столкнулся с проблемой отладки. Кроме того, не должны ли модульные тесты устранить необходимость в отладке? : -)

1 голос
/ 25 февраля 2010

Никто не является более эффективным, чем другой, JIT сделает его наиболее эффективным во время выполнения.

0 голосов
/ 25 февраля 2010

Второй вариант короче и легче для чтения.

Я сомневаюсь, что любой приличный компилятор Java создаст менее эффективный код для первого варианта.

0 голосов
/ 25 февраля 2010

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

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