Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,064
1

Использование переменных типа static

02.12.2020, 02:13. Показов 1616. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уже не первый раз встречаю подобное:
Если static переменная изменяется в ходе программы, скорее всего есть какие то проблемы с дизайном
А что, разве статическая переменная == константа??

И что вообще нужно минимизировать работу в классе через общие переменные, а по максимуму работать через аргументы и возвращаемые данные. А что плохого в том, что разные части класса обмениваются данными через общие переменные, описанные в классе?
Я себе в этом случае представляю статические переменные- как инструмент области видимости в пределах класса. Какая то функция может например изменять значение глобального счетчика, а другая функция работает с отображением этих значений на экране и т.д. и т.п. не понимаю, что в этом плохого и какие это может иметь негативные последствия? Да, это не функциональный подход, может местами это усложняет код. Но разве и не для этого в том числе предназначены статические переменные?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.12.2020, 02:13
Ответы с готовыми решениями:

Использование не static в static методе
Доброго времени суток! Ситуация: Реализую алгоритм Тьюки (кому интересно). Имею такой код: ...

Инициализация static переменных
Есть код class UseStatic { static int a = 3; static int b; static void...

Ошибка при использование static переменных
При использование static переменных в классе выдаёт ошибку: Error: Unresolved external...

Использование переменных строчного типа
Пожалуйста помогите построить блок-схему просто у меня ни одна программа по построению блок схем...

14
Эксперт Java
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
Цитата Сообщение от xoraxax Посмотреть сообщение
race conditi
Почитал. Это понятно. Но наверное, если возникают подобного рода коллизии, то действительно приложение очень сложное или есть совсем явные косяки и возможна рассинхронизация.

Еще вопрос:
Примитивы и объекты отмеченные модификаторами 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
Цитата Сообщение от СергейСереб Посмотреть сообщение
Если static переменная изменяется в ходе программы, скорее всего есть какие то проблемы с дизайном
Вообще Multithreading достаточно сложная тема: требует глубокого понимания архитектуры компьютера (Таненбаум) и многих других понятий.

Не по теме:

Имхо, Stateless и Immutable объекты - рулят. Не надо думать о многопоточности: race conditions, dead locks и т.п.

2
Эксперт Java
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
Эксперт Java
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
Цитата Сообщение от xoraxax Посмотреть сообщение
в другие нужные методы можно передавать параметры и возвращать оттуда значения
Теоретически мы этот вопрос обсудили еще в начале темы. Но не всегда это удобно, тем более, если в логике алгоритма нет неоднозначностей.
Про неудобства - например если не использовать общую переменную, то нужно ее прокидывать транзитом через несколько методов, в которых она вообще не используется. Типа - следствие декомпозиции.
Меня сейчас больше смущает такое непонятное поведение при работе с модификаторами.
0
Эксперт Java
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
Цитата Сообщение от xoraxax Посмотреть сообщение
Причем тут модификаторы вообще
Если в контексте того - использовать общую переменную или передавать и возвращать через десятки методов - то не причем.
А если в контексте странностей поведения при инициализации переменных значениями объектов - то причем.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
04.12.2020, 11:16 11
Давай ты сформулируешь нормально список вопросов, которые у тебя есть. Ребусы разгадывать неохота
0
729 / 435 / 66
Регистрация: 22.12.2013
Сообщений: 2,292
Записей в блоге: 19
04.12.2020, 16:32 12
Цитата Сообщение от СергейСереб Посмотреть сообщение
А что, разве статическая переменная == константа??
Нет. Статическая переменная принадлежит классу, нестатическая - экземпляру - объекту класса.

final для класса означает, что от него нельзя наследоваться.
final для метода или переменной означает, что они не могут быть переопределены в подклассах.
Не перепеприсвоены значение, а переопределены.
1
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,332
04.12.2020, 16:40 13
vvm28, Он скорее про финальное поле класса в виде объекта, то что они должны быть инициализированы либо при объявлении, либо в конструкторе, при этом после инициализации нельзя присвоить другой объект этому полю, а менять существующий можно. Похоже по его логике раз объект финальный, то его и менять нельзя и это вызывает диссонанс.
1
729 / 435 / 66
Регистрация: 22.12.2013
Сообщений: 2,292
Записей в блоге: 19
04.12.2020, 16:42 14
PS. В случае многоточности смотрите mutable/immutable объекты.
1
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,064
04.12.2020, 18:03  [ТС] 15
Цитата Сообщение от alecss131 Посмотреть сообщение
vvm28, Он скорее про финальное поле класса в виде объекта, то что они должны быть инициализированы либо при объявлении, либо в конструкторе, при этом после инициализации нельзя присвоить другой объект этому полю, а менять существующий можно. Похоже по его логике раз объект финальный, то его и менять нельзя и это вызывает диссонанс.
Да. Речь про объект. Так и думал, что final однозначно указывает и для объекта, что его нельзя изменять. Т.к. переопределять объект вообще не представляю зачем могло бы понадобиться после инициализации в классе. Хотя возможно всякое.

Добавлено через 4 минуты
Цитата Сообщение от vvm28 Посмотреть сообщение
Нет. Статическая переменная принадлежит классу, нестатическая - экземпляру - объекту класса.

final для класса означает, что от него нельзя наследоваться.
final для метода или переменной означает, что они не могут быть переопределены в подклассах.
Не перепеприсвоены значение, а переопределены.
Да, с переопределением тоже полезное замечание.

Аналогия с переменной типа static у меня из процедурного программирования)..
В ООП, да, уже дошло, что тут другое значение, касающееся принадлежности классу/его объектам и вообще необходимости создания объекта.
В общем, спасибо за ответы, вроде прояснилось немного))
0
04.12.2020, 18:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.12.2020, 18:03
Помогаю со студенческими работами здесь

pascal..использование переменных типа записи:(
требуется ввести информацию о студентах: фамилия, пол, год рождения, год поступления, год...

Использование переменных типа struct. Работа с файлами
Помогите пожалуйста с лабой Для представления данных в памяти описать структуру. Написать методы...

Использование переменных типа struct. Работа с текстовыми файлами
Написать программу для создания массива записей (структур) со сведениями о студентах хранящейся в...

Использование переменных типа struct. Обработка массива структур
Написать программу для создания массива записей (структур) со сведениями о студентах: ФИО, возраст,...

Использование двух переменных типа Record под именем одной
Прошу помощи. Существует проблема. Имеются две очень похожие записи с разным набором некоторых...

Ключевое слово static для переменных в файле
Много где пишут, если в файле объявить переменную с классом памяти static, то такая переменная...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru