2012-03-12 2 views
5

Я пишу игру, и у меня есть класс для ввода, который содержит булевы для всех разных ключей. Я создаю экземпляр этого класса в основном классе игры. Хорошо ли для булевых объектов быть общедоступными или я должен обращаться к ним с помощью аксессуаров?Неплохо ли иметь общедоступные переменные в нестационарном классе?

+4

Всегда используйте личные переменные с сеттерами/геттерами, если у вас действительно нет –

+2

@JimmyGustafsson: Why ?? Если геттеры/сеттеры действительно ничего не делают, кроме как получать/устанавливать значения, почему бы не сделать их общедоступными? –

+0

Что означают логические символы _about_? – paislee

ответ

4

Вместо того, чтобы иметь boolean для каждого ключа, было бы более удобным для чтения и проще код, если у вас private Map<String, Boolean> keyStates, все ключи инициализируются false.Тогда ваши аксессоры могут быть:

public void setPressed(String keyName) { 
    keyStates.put(keyName, true); 
} 

public void setReleased(String keyName) { 
    keyStates.put(keyName, false); 
} 

public boolean isPressed(String keyName) { 
    return keyStates.get(keyName); 
} 

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

Это не личных предпочтений. Encapsulation и Interfaces являются неотъемлемыми частями программного обеспечения OO Software Engineering и являются основными причинами, по которым Интернет возможен из технического POV.

+0

Спасибо! Это похоже на действительно хороший метод. – user1150769

0

Стандартная практика состоит в том, чтобы сделать переменные-члены либо защищенными, либо частными с помощью геттеров/сеттеров, которые следуют за соглашением java bean. Это, как правило, несколько многословное, но есть очень хорошая библиотека (www.projectlombok.org), которая генерирует методы getters/setters/constructors/toString/hashCode/equals для вас.

2

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

0

Всегда хорошая практика программирования Java, чтобы объявить переменные класса как частные и получить доступ к ним с помощью общедоступных методов getter и setter, если это действительно не нужно объявлять их публичными.

Если вы используете IDE, тогда его просто щелкните, чтобы сгенерировать геттеры и сеттеры для переменных класса/переменных-членов.

1

Это не плохо, но обычно вы хотите, чтобы состояние объекта было encapsulate.

3

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

Обоснование использования геттеров и сеттеров - это то, что вы абстрагируете фактическое представление как поле, чтобы дать вам свободу начать представлять это, например. производное значение без изменения интерфейса. Так что, действительно, дело доходит до того, насколько ценен интерфейс для этого класса для вас.

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

Итак, сколько классов/пакетов будет использовать этот класс? Если это частный, «локальный» класс, то я не думаю, что что-то не так с использованием полей и обновление ваших вызывающих абонентов, если это когда-либо понадобится изменить.

Доступ к полям намного проще, если они тоже final, что часто бывает с подобным объектом.

0

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

Getters and Setters are bad OO design?