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

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

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

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

25.08.2014, 18:50. Просмотров 1140. Ответов 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
26.08.2014, 14:20 #16
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ладно. Я не поленился и написал пример:
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import java.util.ArrayList;
import java.util.List;
 
public class Main {
    
    public static void main(String[] args) {
        Organisation o1 = new Organisation();
        o1.setId(0);
        o1.setName("first");
        List<Organisation> l1 = new ArrayList<>();
        l1.add(o1);
        System.out.println("first: " + l1.get(0).toString());
        List<Organisation> l2 = cloneList(l1);
        System.out.println("second: " + l2.get(0).toString());
        
        l2.get(0).setId(1);
        l2.get(0).setName("second");
        
        System.out.println("first: " + l1.get(0).toString());
        System.out.println("second: " + l2.get(0).toString());
        System.out.println("first: " + l1.get(0).toString());
    }
    
    public static List<Organisation> cloneList(List<Organisation> list) {
        List<Organisation> clone = new ArrayList<Organisation>(list.size());
        for(Organisation item: list)
            try {
                clone.add(item.clone());
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
        return clone;
    }
    
    static class Organisation implements Cloneable {
        
        private String name;
        private int id;
        
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        
        @Override
        protected Organisation clone() throws CloneNotSupportedException {
            Organisation o = (Organisation) super.clone();
            o.name = this.name;
            o.id = this.id;
            return o;
        }
        @Override
        public String toString() {
            return "Organisation [name=" + name + ", id=" + id + "]";
        }
        
    }
 
}
Вывод в консоли:
first: Organisation [name=first, id=0] - первый объект
second: Organisation [name=first, id=0] - его клон

first: Organisation [name=first, id=0]
second: Organisation [name=second, id=1] - после изменение полей клона
first: Organisation [name=first, id=0] - исходный объект остался таким же
1
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 1
26.08.2014, 14:24  [ТС] #17
Цитата Сообщение от Netscape Посмотреть сообщение
после изменение полей клона .... исходный объект остался таким же
А мне то нужно чтобы после изменения полей исходного объекта, клон остался прежним)
0
Netscape
374 / 361 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
26.08.2014, 14:29 #18
Цитата Сообщение от Spelcrawler Посмотреть сообщение
А мне то нужно чтобы после изменения полей исходного объекта, клон остался прежним)
Для моего кода справедливо и это.
Потому что, исходный объект после клонирования не связан с клоном.
Любое изменение любого из этих объектов не повлияет на другой.
1
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 1
26.08.2014, 17:23  [ТС] #19
А как же это объяснить?
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Считал вообще этот latesOrg из старого файла, потом currentOrg из нового, но они все равно имеют один ид. Как так?
Под ид я имею ввиду ссылку на объект, которую видно в отладчике после @

Добавлено через 1 минуту
Считывание - это у меня десериализация из файла, при ней эти "ид" тоже сохраняются?

Добавлено через 2 часа 50 минут
И еще такой вопрос: если сделать таким методом, а клонируемый класс содержит не только примитивы - не примитивы опять таки будут меняться в копии при изменении их в оригинале?
0
Netscape
374 / 361 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
26.08.2014, 17:30 #20
Цитата Сообщение от Spelcrawler Посмотреть сообщение
А как же это объяснить?
Не знаю. Честно говоря, мне лень разбираться в вашем коде.
Лучше его просто выкинуть и написать все заново.
Цитата Сообщение от Spelcrawler Посмотреть сообщение
И еще такой вопрос: если сделать таким методом, а клонируемый класс содержит не только примитивы - не примитивы опять таки будут меняться в копии при изменении их в оригинале?
String не примитив, и он не меняется.
2
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 1
26.08.2014, 17:43  [ТС] #21
Netscape, спасибо, вашим способом все получилось как нужно. Видимо десериализация действительно достает и ссылку на объект. А насчет переписания кода итак уже переписал почти все связанное с этим сравнением)
0
26.08.2014, 17:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2014, 17:43
Привет! Вот еще темы с ответами:

Как сделать копию объекта без какой-либо связи между ними - 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
Здравствуйте! Подскажите, как создать полноценную независимую копию объекта, если известно, что что класс сериализуемого объекта...


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

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

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