39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,064
|
|
1 | |
Использование переменных типа static02.12.2020, 02:13. Показов 1616. Ответов 14
Метки нет (Все метки)
Уже не первый раз встречаю подобное:
И что вообще нужно минимизировать работу в классе через общие переменные, а по максимуму работать через аргументы и возвращаемые данные. А что плохого в том, что разные части класса обмениваются данными через общие переменные, описанные в классе? Я себе в этом случае представляю статические переменные- как инструмент области видимости в пределах класса. Какая то функция может например изменять значение глобального счетчика, а другая функция работает с отображением этих значений на экране и т.д. и т.п. не понимаю, что в этом плохого и какие это может иметь негативные последствия? Да, это не функциональный подход, может местами это усложняет код. Но разве и не для этого в том числе предназначены статические переменные?
0
|
02.12.2020, 02:13 | |
Ответы с готовыми решениями:
14
Использование не static в static методе Инициализация static переменных Ошибка при использование static переменных Использование переменных строчного типа |
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|
02.12.2020, 04:17 | 2 |
Почитай, что такое race condition например
2
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,064
|
|
02.12.2020, 17:48 [ТС] | 3 |
Почитал. Это понятно. Но наверное, если возникают подобного рода коллизии, то действительно приложение очень сложное или есть совсем явные косяки и возможна рассинхронизация.
Еще вопрос: Примитивы и объекты отмеченные модификаторами static final ведут себя по разному. С примитивами понятно. А вот объект - не смотря на модификатор final, инициализированный как static final можно модифицировать. Т.е. объект в этом случае получается совсем не final, а работает как глобальная переменная в рамках класса. Почему так происходит?
0
|
3572 / 2173 / 570
Регистрация: 02.09.2015
Сообщений: 5,490
|
|
02.12.2020, 18:19 | 4 |
С примитивами как раз-таки не все однозначно: long и double совсем не атомарны (proof).
/upd Вообще Multithreading достаточно сложная тема: требует глубокого понимания архитектуры компьютера (Таненбаум) и многих других понятий. Не по теме: Имхо, Stateless и Immutable объекты - рулят. Не надо думать о многопоточности: race conditions, dead locks и т.п.
2
|
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|
02.12.2020, 18:31 | 5 |
вообще в принципе, чем проще будет твой код, тем легче его будет понимать, а если у тебя стэйт меняется из птянадцати мест непонятно в каком порядке, то как за этим уследить?
0
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,064
|
|
03.12.2020, 19:28 [ТС] | 6 |
Так а что с модификаторами то для объектов? У меня диссонанс.
Если в объявлении переменой типа объект указать модификаторы в трех разных вариантах: private final , public , public final , private final - это ничего не меняет, объект можно модифицировать во всех этих случаях. Что за такой нюанс при использовании объектов в качестве значений переменных класса? Имеется в виду, что такая инициализация работает как ссылочная? Почему ни IDE ни компилятор никак не реагируют на такую вольную запись модификаторов, которые по сути имеют разное значение(final/not final)? Только в случае private Object IDE подсказывает, что переменная может быть(можно конвертировать в) final, очевидно намекая, что извне(внешним методом, не принадлежащим классу) приватную переменную изменять нельзя., но фактически то объект можно модифицировать, соответственно и переменная изменится. Кроме того. private final у IDE вопросов не вызывает..Добавлено через 8 минут Вообще, что мне нужно - я хочу инициализировать переменную класса, в которую положить экземпляр другого импортированного класса. А в методах своего класса модифицировать этот объект, ложить нужное значение модифицированного объекта в ту же переменную и где нужно в других методах использовать это значение. Так, чтобы у разных методов был доступ к актальному значению этого объекта.
0
|
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|
03.12.2020, 23:06 | 7 |
в другие нужные методы можно передавать параметры и возвращать оттуда значения
0
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,064
|
|
04.12.2020, 00:23 [ТС] | 8 |
Теоретически мы этот вопрос обсудили еще в начале темы. Но не всегда это удобно, тем более, если в логике алгоритма нет неоднозначностей.
Про неудобства - например если не использовать общую переменную, то нужно ее прокидывать транзитом через несколько методов, в которых она вообще не используется. Типа - следствие декомпозиции. Меня сейчас больше смущает такое непонятное поведение при работе с модификаторами.
0
|
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|
04.12.2020, 00:50 | 9 |
Причем тут модификаторы вообще
0
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,064
|
|
04.12.2020, 10:46 [ТС] | 10 |
Если в контексте того - использовать общую переменную или передавать и возвращать через десятки методов - то не причем.
А если в контексте странностей поведения при инициализации переменных значениями объектов - то причем.
0
|
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|
04.12.2020, 11:16 | 11 |
Давай ты сформулируешь нормально список вопросов, которые у тебя есть. Ребусы разгадывать неохота
0
|
04.12.2020, 16:32 | 12 |
Нет. Статическая переменная принадлежит классу, нестатическая - экземпляру - объекту класса.
final для класса означает, что от него нельзя наследоваться. final для метода или переменной означает, что они не могут быть переопределены в подклассах. Не перепеприсвоены значение, а переопределены.
1
|
Модератор
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,332
|
|
04.12.2020, 16:40 | 13 |
vvm28, Он скорее про финальное поле класса в виде объекта, то что они должны быть инициализированы либо при объявлении, либо в конструкторе, при этом после инициализации нельзя присвоить другой объект этому полю, а менять существующий можно. Похоже по его логике раз объект финальный, то его и менять нельзя и это вызывает диссонанс.
1
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,064
|
|
04.12.2020, 18:03 [ТС] | 15 |
Да. Речь про объект. Так и думал, что final однозначно указывает и для объекта, что его нельзя изменять. Т.к. переопределять объект вообще не представляю зачем могло бы понадобиться после инициализации в классе. Хотя возможно всякое.
Добавлено через 4 минуты Да, с переопределением тоже полезное замечание. Аналогия с переменной типа static у меня из процедурного программирования).. В ООП, да, уже дошло, что тут другое значение, касающееся принадлежности классу/его объектам и вообще необходимости создания объекта. В общем, спасибо за ответы, вроде прояснилось немного))
0
|
04.12.2020, 18:03 | |
04.12.2020, 18:03 | |
Помогаю со студенческими работами здесь
15
pascal..использование переменных типа записи:( Использование переменных типа struct. Работа с файлами Использование переменных типа struct. Работа с текстовыми файлами Использование переменных типа struct. Обработка массива структур Использование двух переменных типа Record под именем одной Ключевое слово static для переменных в файле Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |