С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 1
#1

Сделать копию static объекта - Программирование Android

25.08.2014, 18:50. Просмотров 1142. Ответов 20
Метки нет (Все метки)

Здравствуйте. Есть static класс Utils - работает с ArrayList(добавляет элементы, удаляет, выдает нужный по определенным критериям). Есть AsynkTask, который скачивает с сервера файл, который, в свою очередь, парсится в этот ArrayList(1 файл - 1 элемент ArrayList'a). Проблема в том что этот ArrayList статичный, и при обновлении данных все чему было присвоено его значение - тоже обновляется. А мне нужно чтобы обновлялся только он сам, а все остальное осталось старым. Как это можно реализовать оставив класс и ArrayList статичным? Можно ли вообще?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2014, 18:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сделать копию static объекта (Программирование Android):

Время жизни static объекта - Программирование Android
Приветствую, Что то я запутался с проклятым static, помогите. Дано: public class Main extends Activity{ public static...

Static MediaPlayer - Программирование Android
Добрый день! Пытался реализовать следующий алгоритм работы своего приложения: Пользователь кликая по изображению открывает новый...

BroadcastReceiver + static переменная - Программирование Android
Работая с бродкаст ресивером задался вопросом, как же он всё-таки работает?) Есть следующий код, который фиксирует состояние телефонного...

Объявление static без имени - Программирование Android
Наткнулся на такой код: private static final UriMatcher uriMatcher; static { uriMatcher = new...

Static поле у внутреннего класса - Программирование Android
Есть класс, скажем Building, в нем есть еще один класс, скажем Floor. И вот этот Building хранит несколько экземпляров класса Floor. Что...

Как сделать копию объекта - C#
Всем привет. Как сделать копию объекта так, чтобы копия могла существовать не зависимо от оригинала? Например как это сделать с...

20
Netscape
374 / 361 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
25.08.2014, 19:13 #2
можно.
в месте где используется статичный список создать новый.
static ArrayList static = ...;
ArrayList nonstatic = new ArrayList(static);
// дальше юзать nonstatic
1
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 1
26.08.2014, 10:48  [ТС] #3
Что то не вышло, сравниваю ArrayList который был создан до обновления с ArrayList'ом после обновления. Они идентичны, даже не идентичны, а это один и тот же лист. Как такое возможно? Смотрел в отладчике. Писал логи при создании старого листа - лог выводится один раз, т.е. присваивание не повторяется после обновления. Но лист уже новый. Что можно еще попробовать?

Добавлено через 14 минут
Пробовал даже clone() - результат тот же.

Добавлено через 10 минут
Подозреваю, что пока выполняется AsynkTask, старый лист удаляется из памяти GrabageCollector'ом т.к. он считает его не нужным, а потом когда его требует главный поток инициализирует его заново. Возможно ли такое? И если да, как с этим бороться?

Добавлено через 4 минуты
Ид листов разный, а вот ид элементов в них одинаковый. Похоже последнее подозрение верно.
0
Pablito
2534 / 2013 / 627
Регистрация: 12.05.2014
Сообщений: 7,068
Завершенные тесты: 1
26.08.2014, 11:05 #4
хоть бы код посмотреть
1
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 1
26.08.2014, 11:13  [ТС] #5
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class Comparator {
 
    private ArrayList<Organisation> latestOrgs;
    private ArrayList<Organisation> currentOrgs;
 
 
    public Comparator(ArrayList<Organisation> latestOrgs){//Создается перед началом обновления
        ArrayList<Organisation> staticList = new ArrayList<Organisation>(latestOrgs);
        this.latestOrgs = new ArrayList<Organisation>();
        for(int i = 0; i < staticList.size(); i++){
            this.latestOrgs.add(staticList.get(i));
        }
    }
    public void setCurrentOrgs(ArrayList<Organisation> currentOrgs){//Вызывается после обновления
        this.currentOrgs = currentOrgs;
    }
    private Organisation getLatestOrg(String id){
        for(int i = 0; i < latestOrgs.size(); i++){
            if(latestOrgs.get(i).getId().equals(id)){
                return latestOrgs.get(i);
            }
        }
        return null;
    }
    private Organisation getCurrentOrg(String id){
        for(int i = 0; i < currentOrgs.size(); i++){
            if(currentOrgs.get(i).getId().equals(id)){
                return currentOrgs.get(i);
            }
        }
        return null;
    }
    public void compareAmounts(Context context, String id){//Вызывается после setCurrentOrgs() 
        Organisation latestOrg = getLatestOrg(id);
        Organisation currentOrg = OrgUtils.getOrganisation(context, id);
       //Вот после этих строк в отладчике  latestOrg и currentOrg имеют один и тот же ид(ссылку или как это правильно называется), а у ArrayList'ов разные ид. 
        
    }
 
 
}
0
Pablito
2534 / 2013 / 627
Регистрация: 12.05.2014
Сообщений: 7,068
Завершенные тесты: 1
26.08.2014, 11:28 #6
а где в коде реализован совет, который выше дал Netscape ?
1
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 1
26.08.2014, 11:33  [ТС] #7
Цитата Сообщение от Паблито Посмотреть сообщение
а где в коде реализован совет, который выше дал Netscape ?
Java
1
2
3
4
5
6
7
public Comparator(ArrayList<Organisation> latestOrgs){
        ArrayList<Organisation> staticList = new ArrayList<Organisation>(latestOrgs);
        this.latestOrgs = new ArrayList<Organisation>();
        for(int i = 0; i < staticList.size(); i++){
            this.latestOrgs.add(staticList.get(i));
        }
    }
Разве это не оно?
Пробовал и так
Java
1
2
3
4
5
 public Comparator(ArrayList<Organisation> latestOrgs){
        ArrayList<Organisation> staticList = latestOrgs;
        this.latestOrgs = new ArrayList<Organisation>(staticList);
        
    }
0
Pablito
2534 / 2013 / 627
Регистрация: 12.05.2014
Сообщений: 7,068
Завершенные тесты: 1
26.08.2014, 11:55 #8
мне трудно вникнуть в твой код, я в процессе изучения языка
по идее new ArrayList<>(staticList); делает не глубокую копию обхекта, то есть так не катит

я бы сделал так
ArrayList<> list = new ArrayList<>();
Collections.copy(statList, list);

Самое интересно, что statList.equals(list) говорит true, но это все же разные объекты.
Хотя там можно и просто написать list.addAll(staticList); вместо Collections бла бла.
0
Netscape
374 / 361 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
26.08.2014, 12:10 #9
Если нужен deep copy, то как-то так:

Java
1
2
3
4
5
public static List<Organisation> cloneList(List<Organisation> list) {
    List<Organisation> clone = new ArrayList<Organisation>(list.size());
    for(Organisation item: list) clone.add(item.clone());
    return clone;
}
Добавлено через 1 минуту
Конечно, класс Organisation должен реализовать интерфейс Cloneable.

Добавлено через 2 минуты
Паблито,
Цитата Сообщение от Паблито Посмотреть сообщение
ArrayList<> list = new ArrayList<>();
Collections.copy(statList, list);
так же делать только shallow copy.
1
Pablito
2534 / 2013 / 627
Регистрация: 12.05.2014
Сообщений: 7,068
Завершенные тесты: 1
26.08.2014, 12:16 #10
Netscape, нет, не shallow
это просто метод копирования всех элементов из одного листа в другой, а сам объект создается строкой выше
и цикл там вообще ни к чему, либо через Collections.copy либо list.addAll
1
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 1
26.08.2014, 12:18  [ТС] #11
Но при изменении исходного элемента, скопированный тоже изменится. Или нет?
0
Pablito
2534 / 2013 / 627
Регистрация: 12.05.2014
Сообщений: 7,068
Завершенные тесты: 1
26.08.2014, 12:19 #12
в моем варианте нет, я до того как написать - проверяю
1
Netscape
374 / 361 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
26.08.2014, 12:33 #13
Цитата Сообщение от Паблито Посмотреть сообщение
это просто метод копирования всех элементов из одного листа в другой, а сам объект создается строкой выше
это и есть shallow copy.
списки будут разные, но ссылки в них будут указывать на одни и те же объекты.
2
Pablito
2534 / 2013 / 627
Регистрация: 12.05.2014
Сообщений: 7,068
Завершенные тесты: 1
26.08.2014, 12:43 #14
логично значит я не вник в задачу
1
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 1
26.08.2014, 13:23  [ТС] #15
Что то я вообще не понимаю. Считал вообще этот latesOrg из старого файла, потом currentOrg из нового, но они все равно имеют один ид. Как так?
0
26.08.2014, 13:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2014, 13:23
Привет! Вот еще темы с ответами:

Как сделать копию объекта без какой-либо связи между ними - C#
Есть следующий код: class Class1 { public int Matrix; public int CanMatrix; public Class1() { ...

.NET 3.x Как изменить свойство non-static объекта из static метода - C# ASP.NET
Понимаю, что такое не задумано средствами Net Framework, но у меня из-за этого не работает одна фишка, которую я месяц писал, вообщем у...

Как создать копию объекта? - VBA
Как создать копию объекта а не еще одну ссылку на объект........?

Создать полноценную копию объекта - Java SE
Здравствуйте! Подскажите, как создать полноценную независимую копию объекта, если известно, что что класс сериализуемого объекта...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.