Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
#1

Как правильно создавать объекты ? - Программирование Android

22.09.2013, 20:45. Просмотров 688. Ответов 13
Метки нет (Все метки)

Как правильно создавать объекты и как они расходуют память, что является правильным подходом?

вариант 1:
Java
1
2
3
4
5
6
7
8
9
10
  public class MyClassManager extends Activity {
 
        Class_1  class_1 = new Class_1();
 
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
         }
 
     }
или

вариант 2
Java
1
2
3
4
5
6
7
8
9
10
11
12
public class MyClassManager extends Activity {
 
        Class_1  class_1;
 
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        class_1 = new Class_1();
 
         }
 
     }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2013, 20:45     Как правильно создавать объекты ?
Посмотрите здесь:

Как создавать custom view компоненты с функционалом и присваивать им id? - Программирование Android
Доброго времени суток) В моём приложении присутствует кнопка, для которой я хочу реализовать следующие действия: 1) Создать "блок", где...

Как праивильно отрисовывать объекты? - Программирование Android
Здравствуйте! Имеется просьтенькая спрайтовая игра. Как выполняю отприсовку: 1. Рисую белый фон 2. Рисую спрайты ...

Как вывести объекты списком? - Программирование Android
В XML расположил все объекты вертикально. Но при компиляции многие объекты, которые в низу не выводятся, по идее должен появиться скрул (Я...

Как получить объекты записные в TableRow? - Программирование Android
Добавляю несколько TextView в TableRow, теперь нужно достать TextView для прочтения текста с него. Как к достать массив объектов...

Как перебрать объекты разного класса - Программирование Android
Делаю игру. Там есть монстры. Будет класс Enemy и несколько дочерних классов Monstr1 extends Enemy, Monstr2 extends Enemy.. и т.д... ...

Как в Android Studio создавать установочные apk файлы для наших гуглофонов? - Программирование Android
Как в Android Studio создавать установочные apk файлы для наших гуглофонов? В Eclipse это проект->Android Tools->Export Signed...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
haribo
41 / 41 / 3
Регистрация: 26.05.2013
Сообщений: 160
23.09.2013, 09:58     Как правильно создавать объекты ? #2
В данном (и в 1 и во 2) случае class_1 является полем класса + в зависимости от модификатора (public, private, protected) данное поле приобретает те или иные свойства.
Такие переменные потоконебезопасные, поэтому использовать их повсеместно, без особой необходимости не надо.

И в первом и во втором случае новый объект создастся один раз - при старте активности, только вот какая ерунда есть:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MyClassManager extends Activity {
 
        Class_1  class_1 = new Class_1();
 
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            //some code
            if (a < 0 ) {
                return;
            } else {
                class_1.iSeeYou();
            }
        }
 }
В данном случае даже если class_1 не пригодится, объект все равно будет создан.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 public class MyClassManager extends Activity {
 
        Class_1  class_1;;
 
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            //some code
            if (a < 0 ) {
                return;
            } else {
                class_1 = new Class_1();
                class_1.iSeeYou();
            }
        }
 }
А в данном случае объект создастся только когда необходима будет работа с ним, если программа пойдет по другой ветви развития объекта такого не будет.

Но на самом деле в данном случае это не критично, gc съест этот объект и никто ничего не заметит и не почувствует, на производительности это не скажется.
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
24.09.2013, 00:19  [ТС]     Как правильно создавать объекты ? #3
Цитата Сообщение от haribo Посмотреть сообщение
Такие переменные потоконебезопасные, поэтому использовать их повсеместно, без особой необходимости не надо.
а можно подробней? если так нельзя то как надо?
haribo
41 / 41 / 3
Регистрация: 26.05.2013
Сообщений: 160
24.09.2013, 01:01     Как правильно создавать объекты ? #4
Цитата Сообщение от Stylish2013 Посмотреть сообщение
а можно подробней? если так нельзя то как надо?
в зависимости от задачи
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
24.09.2013, 01:17  [ТС]     Как правильно создавать объекты ? #5
Но должен же быть какой-то стандарт ?? нужно чтобы не расходовалась память.
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
24.09.2013, 01:44     Как правильно создавать объекты ? #6
Цитата Сообщение от Stylish2013 Посмотреть сообщение
нужно чтобы не расходовалась память.
об этом GC позаботится.
Hank
49 / 40 / 3
Регистрация: 28.12.2011
Сообщений: 229
24.09.2013, 09:17     Как правильно создавать объекты ? #7
В данном (и в 1 и во 2) случае class_1 является полем класса + в зависимости от модификатора (public, private, protected) данное поле приобретает те или иные свойства.
Такие переменные потоконебезопасные, поэтому использовать их повсеместно, без особой необходимости не надо.
Я не понял, потоконебезопасно использовать переменные с модификатором или без? Чем это грозит?
haribo
41 / 41 / 3
Регистрация: 26.05.2013
Сообщений: 160
24.09.2013, 10:45     Как правильно создавать объекты ? #8
все зависит от конкретного случая. переменные которые являются полями класса - потоконебезеопасные.
для лучшего понимая есть книжка МакКоннела - Совершенный код.
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
25.09.2013, 22:42  [ТС]     Как правильно создавать объекты ? #9
Цитата Сообщение от haribo Посмотреть сообщение
все зависит от конкретного случая. переменные которые являются полями класса - потоконебезеопасные.
для лучшего понимая есть книжка МакКоннела - Совершенный код.
понимаю что есть конкретный случай, но есть же правила какие-то.???
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.09.2013, 23:46     Как правильно создавать объекты ? #10
Цитата Сообщение от haribo Посмотреть сообщение
переменные которые являются полями класса - потоконебезеопасные.
можно подробнее? впервые слышу о такой зависимости. насколько я знаю, объект может быть потокобезопасные или нет вне зависимости от того является ли он полем класса, например HashMap не потокобезопасный, а ConcurrentHashMap потокобезопасный.

Добавлено через 4 минуты
Цитата Сообщение от Stylish2013 Посмотреть сообщение
но есть же правила какие-то.???
не держите указатели на неиспользуемые объекты.
haribo
41 / 41 / 3
Регистрация: 26.05.2013
Сообщений: 160
26.09.2013, 00:03     Как правильно создавать объекты ? #11
Цитата Сообщение от V0v1k Посмотреть сообщение
можно подробнее? впервые слышу о такой зависимости. насколько я знаю, объект может быть потокобезопасные или нет вне зависимости от того является ли он полем класса, например HashMap не потокобезопасный, а ConcurrentHashMap потокобезопасный.
HashMap не предназначен для работы с одним объектом коллекции в разных потоках, а ConcurrentHashpMap это позволяет, но это не говорит о том что HashMap потоконебезопасен.

Постараюсь привести пример в контексте Spring MVC.

Контроллер является бином, то есть это синглтон, то есть он создается один раз при запуске приложения.
В системе может несколько пользователей.
Допустим, зашел пользователь Вася и сохранил в поле класса String name = "Вася", а после него зашел пользователь "Петя" и распечатала документ, а метод печати документа использовал поле класса name как доверенное лицо, и Петя получит документ с доверенным лицом "Вася".
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.09.2013, 00:49     Как правильно создавать объекты ? #12
Цитата Сообщение от haribo Посмотреть сообщение
HashMap не предназначен для работы с одним объектом коллекции в разных потоках, а ConcurrentHashpMap это позволяет, но это не говорит о том что HashMap потоконебезопасен.
именно об этом и говорит.

Цитата Сообщение от haribo Посмотреть сообщение
Постараюсь привести пример в контексте Spring MVC.
Контроллер является бином, то есть это синглтон, то есть он создается один раз при запуске приложения.
В системе может несколько пользователей.
Допустим, зашел пользователь Вася и сохранил в поле класса String name = "Вася", а после него зашел пользователь "Петя" и распечатала документ, а метод печати документа использовал поле класса name как доверенное лицо, и Петя получит документ с доверенным лицом "Вася".
термин "потокобезопасный" применяется к классу или коду, а не к объекту.
да, данная реализация не потокобезопасна, но именно реализация а не поле name, именно ваш контроллер потоконебезопасный, так как использует одно поле для разных пользоваталей, но к потокобезопасности поля это отношение не имеет.
неважно как вы обявите String переменную, потокобезопасность String'а от этого не изменится. вы можете назвать это поле потоконебезопасным или потокобезопасным если именно вызовы name.sameMethod() будут выполнятся в нескольких потоках некорректно или корректно соответственно.
haribo
41 / 41 / 3
Регистрация: 26.05.2013
Сообщений: 160
26.09.2013, 00:57     Как правильно создавать объекты ? #13
Цитата Сообщение от V0v1k Посмотреть сообщение
именно об этом и говорит.


термин "потокобезопасный" применяется к классу или коду, а не к объекту.
да, данная реализация не потокобезопасна, но неважно где вы обявите String переменную, потокобезопасность String'а от этого не изменится. вы можете назвать это поле потоконебезопасным или потокобезопасным если именно вызовы name.sameMethod() будут выполнятся в нескольких потоках некорректно или корректно соответственно.
понял, мы говорим немного о разных вещах, но в моем контексте "сделать филдчекер полем класса является потоконебезопасным решением" - это правильный термин =)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.09.2013, 02:00     Как правильно создавать объекты ?
Еще ссылки по теме:

Как правильно парсить? - Программирование Android
У меня есть следующая строка: Как с помощью JSON-парсера считать значение number с объекта order со значением 0 не перебирая их?...

Как правильно сверстать в android - Программирование Android
Мне нужно что-нибудь(курсы, видео уроки, книги, статьи). Как правильно создать макет в фотошопе и сверстать его в android

Как правильно работать с BITMAP? - Программирование Android
задача менять цвет картинки которая стоит в фоне у EditText; ну почитал, посмотрел ... везде работают с ImageView/// как мне...

Как правильно импортировать проект? - Программирование Android
Я нашел проект похожие на мою. По этой ссылке http://programmerguru.com/android-tutorial/android-multicast-push-notifications-using-gcm/. В...


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

Или воспользуйтесь поиском по форуму:
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.09.2013, 02:00     Как правильно создавать объекты ? #14
Цитата Сообщение от haribo Посмотреть сообщение
"сделать филдчекер полем класса является потоконебезопасным решением"
сделайте полем класса User, и данная проблема потокобезопасности решится, хоть мы все равно используем поле класса)
если в синглтоне есть поле name, то подразумевается что это общее поле для всех а не персональное поле для отдельного пользователя, это уже особенность синглтона как и статик полей, здесь проблема скорее не в потоках, а в неправильном использование синглтона, здесь даже при одном потоке напечатает "Вася", вы ведь описали последовательные действия а не параллельные - сначала записали "Вася", потом Петя напечатал "Вася", здесь количество потоков ни на что не влияет, если в одном потоке выполните те же действия в той же последовательности - получите тот же результат, здесь проблема общих ресурсов а не потоков.

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

вот, почитайте на досуге
http://blogs.msdn.com/b/ruericlipper...9/9929760.aspx

Добавлено через 26 минут
в общем, если уж говорить про объекты, то для меня объект потоконебезопасный если во время выполнения его метода другой поток может изменить его внутреннее состояние так, что метод выполнится некорректно.
объект "Вася" не изменился(name - ссылка на объект ), так как String immutable, изменился именно объект контроллера, именно внутреннее состояние контроллера, что и привело к ошибке, и это значит что именно контролер потоконебезопасный.
name это лишь указатель, а методы объекта "Вася" будут выполнятся одинаково вне зависимости от того где вы его инициализируете или является ли name полем класса.

Добавлено через 7 минут
ну в общем, это скорее был пример неправильного использования синглтонов / статик полей.

Добавлено через 13 минут
Цитата Сообщение от V0v1k Посмотреть сообщение
термин "потокобезопасный" применяется к классу или коду, а не к объекту.
точнее хотел написать "а не к переменной"
обычно просто говорят "класс A потокобезопасен, а класс B потоконебезопасен", а является ли переменная этого класса полем другого класса или локальной переменной не имеет значения для него, сам этот факт никак не влияет на выполнение его методов. так вот, в вашем случае String так и остался потокобезопасным, хоть он и поле класса, а вот ваш контроллер потоконебезопасный.

Добавлено через 9 минут
а если по теме, то обычно инициализирую объекты в onCreate, а точнее в методах init*** которые в свою очередь вызываются в методе onCreate.
Yandex
Объявления
26.09.2013, 02:00     Как правильно создавать объекты ?
Ответ Создать тему
Опции темы

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