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

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

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

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

22.09.2013, 20:45. Просмотров 705. Ответов 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();
 
         }
 
     }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2013, 20:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как правильно создавать объекты ? (Программирование Android):

Как создавать 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...

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

Добавлено через 4 минуты
Цитата Сообщение от Stylish2013 Посмотреть сообщение
но есть же правила какие-то.???
не держите указатели на неиспользуемые объекты.
0
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 как доверенное лицо, и Петя получит документ с доверенным лицом "Вася".
0
V0v1k
1159 / 983 / 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() будут выполнятся в нескольких потоках некорректно или корректно соответственно.
1
haribo
41 / 41 / 3
Регистрация: 26.05.2013
Сообщений: 160
26.09.2013, 00:57 #13
Цитата Сообщение от V0v1k Посмотреть сообщение
именно об этом и говорит.


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

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

вот, почитайте на досуге
http://blogs.msdn.com/b/ruericlippert/archive/2009/10/19/9929760.aspx

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

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

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

Добавлено через 9 минут
а если по теме, то обычно инициализирую объекты в onCreate, а точнее в методах init*** которые в свою очередь вызываются в методе onCreate.
1
26.09.2013, 02:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.09.2013, 02:00
Привет! Вот еще темы с ответами:

Как на Google Map убрать определённые объекты - музеи, магазины и др - Программирование Android
У карты от Google есть возможность отключить городские объекты - станции метро, банки, магазины, музеи и др. Нужно оставить только карту,...

Стек или куча: как "правильно" создавать объекты классов? - C++
У меня несколько странновато-ламерский вопрос, но ведь в том и смысл: чтобы таких вопросов не осталось, на них один фиг сначала нужно...

Как динамически создавать объекты? - Java
Добрый день! Есть задача нарисовать картинку, на которой будут двигаться объектики, все это происходит на JPanel при помощи класса...

.NET 2.x Как динамически создавать объекты класса ? - C#
Всем привет! У меня есть файл app.config в котором хранится информация о точках. У каждой точки 3 св-ва: name, defaultValue и match....


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

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

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