Создание объектов в итерации - лучший подход - PullRequest
0 голосов
/ 09 октября 2011

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

Допустим, у нас есть этот класс-обёртка:

public class Photo{
    private String url;
    private String creator;

    public Photo(String url, String creator){
        this.url = url;
        this.creator = creator;
    }
    // Getter methods down here...
}

И у нас есть JSONArray фотографий, из которых нам нужны только строки url - и creator:

JSONArray photos = json.getJSONArray("photos");
Photo[] photo_arr = new Photo[photos.length()];
// Iterate:
for (int i = 0; i < photos.length(); i++){
    // Create the objects here.
}

Теперь я вижу три возможных решения:

Создание временных переменных

Создание некоторых временных переменных, которые получают нужные значения из текущего объекта, а затем создают новый Photo -объект:

// Iterate:
String url = "";
String creator = "";
for (int i = 0; i < photos.length(); i++){
    url = photos[i].getString("url");
    creator = photos[i].getString("creator");
    photo_arr[i] = new Photo(url, creator);
}

Использовать возвращаемые значения непосредственно в конструкторе

Не создавайте временные переменные, а используйте возвращаемые значения из getString() -метода в вызове конструктора:

// Iterate:
for (int i = 0; i < photos.length(); i++){
    photo_arr[i] = new Photo(
        photos[i].getString("url"),
        photos[i].getString("creator")
    );
}

Использование методов установки

Добавление конструктора без параметров и методов установки для url и creator к классу-обертке и использование их для заполнения объекта:

// Iterate:
for (int i = 0; i < photos.length(); i++){
    photo_arr[i] = new Photo();
    photo_arr[i].setUrl( photos[i].getString("url") );
    photo_arr[i].setCreator( photos[i].getString("creator") );
}

Какой подход лучше / быстрее / чище?

Ответы [ 2 ]

3 голосов
/ 09 октября 2011

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

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

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

2 голосов
/ 09 октября 2011

Разница в скорости незначительна между решениями, которые вы предоставили для кода, который вы просматриваете здесь.Читаемость на самом деле важнее, чем можно подумать.Для вас более важно, чтобы ваши конечные пользователи испытали увеличение скорости на 1%?Или что вы сможете сохранить этот код в будущих версиях?Ответ обычно последний.

По этой причине я бы пошел с Создание временных переменных . Использование методов установки (на мой взгляд) менее читабельно, но потенциально медленнее, поскольку вам придется вводить каждый из этих методов установки и распределять эти ресурсы. Использование [возвращаемых] значений непосредственно в конструкторе (опять же, на мой взгляд) менее читабельно и поэтому его следует избегать в подобных случаях;но если возвращаемый объект был чем-то большего размера, то выделение ресурсов для хранения его во временном значении на самом деле может быть незначительным.

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