Разве поля в классах не похожи на глобальные переменные? - PullRequest
7 голосов
/ 29 ноября 2010

Я начал изучать функциональный язык программирования (SML) и немного программировал на этом языке.А потом я начал проверять Java и почувствовал, что поля классов выглядят как глобальные переменные и усложняют программирование.Например, я должен прочитать методы, чтобы увидеть, какие из них читать / писать и т. Д.

Из того, что я слышал, использование глобальных переменных в таких языках программирования, как C, - плохая идея. Но как насчет полей классов Java, не являются ли они чем-то вроде глобальных переменных для всех ваших методов класса? Разве это плохая идея использовать поля? (или, может быть, я что-то не так понял или я программирую "не так" на Java)

Ответы [ 5 ]

3 голосов
/ 29 ноября 2010

Я предполагаю, что под "переменными класса" вы подразумеваете "статические переменные".

Вы спрашиваете "не являются ли они чем-то вроде глобальных переменных для всех ваших методов класса?".

Да,вы правы.Внутри класса они ведут себя как глобалы со всеми их проблемами.

Разница в том, что ваши классы не должны быть такими же сложными, как целые программы, и, следовательно, было бы легче понять и устранить проблемы, вызванные ими.
Чем меньше кода может изменить переменную, тем меньше случаев вы должны учитывать.Глобальные переменные могут быть изменены произвольным неизвестным кодом.

В некоторых ситуациях также имеет абсолютный смысл, чтобы все экземпляры класса разделяли переменную (например, одиночный код).Вы просто должны использовать это ответственно.

Если вы не используете их?
Нет, вы можете использовать их.Но ограничьте их видимость необходимым минимумом, чтобы они не стали глобальными «де-факто».
Также сделайте их окончательными, если это возможно.

3 голосов
/ 29 ноября 2010

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

2 голосов
/ 29 ноября 2010

Я бы сказал, что вы не совсем понимаете, как работает Java (или любой другой объектно-ориентированный язык).

В объектно-ориентированных языках классы представляют разные типы вещей, которые могут вам понадобиться во всей вашей программе,Лучше проиллюстрировать это на примере.Допустим, в вашей программе вы собираетесь моделировать автомобили.

У вас будет класс Car, и вы создадите новый объект (новый экземпляр) класса Car для представления каждого нового автомобиля, который вам нужен.Сам автомобиль состоит из разных компонентов, у вас есть колеса, мотор, окна и т. Д. Таким образом, у вас будут классы для каждого из этих компонентов, и каждый объект автомобиля будет содержать свой собственный набор объектов из всех различных классов, а именно:

Car1 {
       motor1
       window1.1, window1.2
       wheel1.1,wheel1.2
}

Car2 {
       motor2
       window2.1, window2.2
       wheel2.1,wheel2.2
}

В этом случае вы должны определить каждый из компонентов автомобилей как поля класса.Эти поля для всех эффектов являются «глобальными», так как к ним можно получить доступ из любого из методов этого класса.Вы, похоже, упускаете из виду то, что каждый новый объект этого класса имеет свой собственный набор полей и методов.Они не разделяют их, поэтому каждый мотор, комплект колес и т. Д. Принадлежит одному экземпляру класса Car.Так что, если в классе автомобиля у вас есть метод, который называется, скажем, deleteWindows (), который избавит от всех окон, и вы вызвали этот метод на car2, это не приведет к удалению окон car1.

Другойважная деталь в том, что вы можете определить эти переменные с помощью нескольких «префиксов» (тоже методов).Во-первых, у вас есть публичное и частное (защищено, но я не буду вдаваться в это).Объявляя переменную как закрытую, вы говорите, что единственный объект, который может получить доступ к этой переменной и изменить ее, - это тот, кто владеет ею.С другой стороны, открытая переменная может быть доступна и изменена любым другим объектом.Они доступны, но вы должны явно сказать, что хотите изменить переменную этого объекта (написав objectsName.variable, в нашем случае car1.motor).

У вас также могут быть переменные / методы, которые являются общими для всехэкземпляры класса.Для этого вы объявляете их как статические (они фактически принадлежат классу, а не какому-либо объекту этого класса).Частные / публичные все еще применяются, приватные статические переменные доступны только экземплярам этого класса (и статическим методам того же класса), в то время как публичные доступны любому другому классу / объекту.Чтобы получить к ним доступ вне класса, к которому они принадлежат, вы используете ClassName.variable / method (так Car.variable в предыдущем примере).

Иногда вам может понадобиться класс, который не имеет смысласоздание экземпляра.Я нахожу, что мне часто нужно создавать класс Maths, который содержит несколько математических операторов, которые я хочу использовать во всей программе.Создавать объект Maths не имеет смысла, поэтому вы просто определили бы все его методы как «public static» и обращались к ним всякий раз, когда вам это нужно в других ваших классах.

Надеюсь, я поставил под сомнение ваши сомнения.В любом случае, я бы посоветовал вам немного почитать об объектно-ориентированном программировании, возможно, получить книгу, которая учит Java, с большим начальным акцентом на объектную ориентацию (ОО), хотя даже если это не сложная концепция для понимания, она может быть сложнойпривыкнуть к нему и правильно программировать на языке OO, если вы не из OO.

Возможно, вы захотите взглянуть на BlueJ.Это Java IDE, которая в основном заставляет вас понимать и использовать ОО программирование.Это не то, что я предлагаю использовать слишком долго, но это может быть хорошим началом, пока вы не получите хорошее представление об основах ОО.

Zepee

1 голос
/ 29 ноября 2010

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

Глобальные переменные доступны из любой области.Они, как правило, также доступны для записи из любой области.Это затрудняет понимание и отладку больших кодовых баз.Глобальные переменные также приглашают nameclash.

Поля класса находятся в области видимости класса.Они, как правило, заключены в класс с закрытым доступом, предотвращая доступ извне класса.Это ограничивает прямой доступ и модификацию небольшим подмножеством кода.

0 голосов
/ 29 ноября 2010

Но в Java вся программа написана не с использованием одного класса. И именно константы (открытые статические конечные поля) похожи на глобальные переменные. И мой совет, чтобы вы не концентрировались на каждой отдельной части Java, что хорошего в Java, это то, что она дает в целом. Потому что именно тогда вы видите важность каждой из этих особенностей Java.

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