Инициализация переменной - PullRequest
0 голосов
/ 21 февраля 2011

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

ArrayList<Movie> localMovies = new ArrayList<Movie>();    
for (File file : listOfFiles) {
    Movie movie = new Movie();
    movie.setTitlePattern(filePattern);
    localMovies.add(movie);
}

Или

ArrayList<Movie> localMovies = new ArrayList<Movie>();
Movie movie = new Movie();    
for (File file : listOfFiles) {
    movie.setTitlePattern(filePattern);
    localMovies.add(movie);
}

Ответы [ 3 ]

3 голосов
/ 21 февраля 2011

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

Два фрагмента делают разные вещи .

  • Первая версия заполняет список различными Movie объектами.

  • Вторая версия заполняет список несколькими ссылками на один объект Move.Затем вы переходите к изменению шаблона заголовка этого объекта.Поэтому, когда цикл завершится, у вас будет N ссылок на один и тот же объект, и шаблон заголовка для этого объекта будет последним установленным.

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


Сказав это, «неправильная» версияВаш код, вероятно, немного быстрее.Является ли разница существенной (о чем стоит беспокоиться), зависит от контекста.И вопрос в любом случае спорный.

Если бы вы сравнили производительность этих двух "правильных" версий:

ArrayList<Movie> localMovies = new ArrayList<Movie>();    
for (File file : listOfFiles) {
    Movie movie = new Movie();
    movie.setTitlePattern(filePattern);
    localMovies.add(movie);
}

и

ArrayList<Movie> localMovies = new ArrayList<Movie>();  
Movie movie;  
for (File file : listOfFiles) {
    movie = new Movie();
    movie.setTitlePattern(filePattern);
    localMovies.add(movie);
}

, было бы больше всегоскорее всего не будет заметной разницы.

2 голосов
/ 21 февраля 2011

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

1 голос
/ 21 февраля 2011

Для эффективности, второй, так как он не должен каждый раз вызывать и выполнять конструктор.

Для корректности, однако, вы, вероятно, хотите первый, так как второй дает вам много разтот же объект в списке.

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