Разве плохо иметь публичные переменные в нестатическом классе? - PullRequest
5 голосов
/ 12 марта 2012

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

Ответы [ 7 ]

4 голосов
/ 12 марта 2012

Вместо того, чтобы иметь 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, не подвергая его внешнему воздействию.

Это не личное предпочтение. Инкапсуляция и Интерфейсы являются неотъемлемыми частями OO Software Engineering и являются основными причинами проектирования, по которым Интернет возможен с технической точки зрения.

3 голосов
/ 12 марта 2012

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

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

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

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

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

2 голосов
/ 12 марта 2012

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

1 голос
/ 12 марта 2012

Это неплохо, но обычно вам нужно инкапсулировать состояние объекта.

0 голосов
/ 12 марта 2012

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

Геттеры и сеттеры плохой ОО дизайн?

0 голосов
/ 12 марта 2012

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

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

0 голосов
/ 12 марта 2012

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

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