Оба методы страшна, но с использованием сорбента является общей (и безопаснее) практикой.
Чтобы получить доступ к общедоступному элементу данных (общедоступное или общедоступное свойство a.k.a.) класса, вы должны знать сведения о реализации этого класса (имя члена данных и тип элемента данных). Это плохо. он нарушает концепцию ООП «скрытие информации» и увеличивает «сцепление».
Использование геттера также плохо (как в плохой практике ООП), потому что объекты не просто обертывают данные; объекты должны инкапсулировать функциональность и данные. «Сохраните это значение здесь, чтобы я мог его получить позже» - это не функциональность; это функция hoot (как у обезьяны в hage hack). Геттеры; однако, принятая практика в java (и другие языки OOP-lite, такие как C++ и C#).
Чтобы вы не считали, что я - немного башня из слоновой кости, я, конечно, использую геттеры; Я использую java, поэтому я использую getters.
Getters отлично подходит для выполнения работы (без каламбуров), просто не ходите вокруг, полагая, что «IR gud OOP Prgmr», потому что, если вы используете геттеры, вы не являетесь «хорошим программистом», вы просто программист, который выполняет работу.
Редактировать: Возможно, лучший способ.
Лучше всего не использовать геттеры, а вместо этого создавать классы, чтобы они отображали функциональность, а не данные. На практике есть момент, когда это ломается; например, если вам нужно отобразить адрес на странице JSP, вы поместите бит в запрос (или сеанс или бла) с адресом и выставляете значения с помощью геттеров. «Более чистый чистый» способ заключается в том, чтобы поместить компонент, который выставил «отображение адреса на jsp».
Edit2: Возможно, лучший пример.
Скажем, я работаю в телефонной компании в США, и у меня есть объект, который представляет собой номер телефона для клиентов. Это может выглядеть следующим образом:
public class CustomerPhoneNumber
{
private String npa; // numbering plan area (google search nanp for more details)
private String nxx; // exchange.
private String serviceNumber;
public String toString()
{
return "(" + npa + ") " + nxx + "-" + serviceNumber;
}
public boolean equals(Object object)
{
... standard equals implementation (assume this works)
}
}
Теперь предположим, что я получаю номер телефона в качестве входных данных с веб-страницы в виде String inputPhoneNumber
. В целях обсуждения класс, который получает этот вход, называется «сервлет».
Как я могу ответить на этот вопрос: «Является ли номер входного телефона в моем списке объектов CustomerPhoneNumber?»
Вариант 1 делает публичные члены данных npa, nxx и serviceNumber общедоступными и доступ к ним. Это ужасно.
Вариант 2 предоставляет геттеры для npa, nxx и служебного номера и сравнивает их с входом. Также ужасно, слишком много внутренних деталей разоблачено.
Вариант 3 представляет собой приемник, который возвращает форматированный номер телефона (я назвал это toString() выше). Это умнее, но все еще ужасно, потому что сервлет должен знать формат, который будет использоваться геттером, и убедитесь, что вход форматируется одинаково.
Вариант 4 (я называю это «Добро пожаловать в ООП») предоставляет метод, который принимает строку и возвращает true, если это соответствует номеру службы клиента. Это лучше и может выглядеть следующим образом (название длинное, но достаточно для данного примера):
public boolean doesPhoneNumberMatchThisInput(final String input)
{
String formattedInput;
String formattedCustomerPhoneNumber = npa + nxx + serviceNumber;
formattedInput = ... strip all non-digits from input.
return StringUtils.equals(formattedCustomerPhoneNumber, formattedInput);
}
Это победитель, потому что никаких деталей реализации не подвергается. Также toString может использоваться для вывода номера телефона на странице JSP.
StringUtils является частью Apache Commons Lang.
Много ресурсов [здесь] (http://stackoverflow.com/q/1568091/387852), [здесь] (http://stackoverflow.com/q/565095/387852) и [здесь] (http : //stackoverflow.com/q/996179/387852). –
Но что, если у меня есть 50 переменных, которые описывают объект. Например, скажем, у меня есть объект под названием «Автомобиль», а затем у меня есть куча переменных, таких как carType, carColor, carHP, carMaker, carName, carWheelBase, carMPG, carTransmission, carEngine и т. Д. ... мне нужно сделать getter и сеттер для каждого из них? Это похоже на TON дополнительного кодирования .... – SkyeBoniwell
Современные IDE (например, Eclipse) могут делать это автоматически. Но вы также должны спросить себя, нужно ли вам подвергать эти переменные внешнему миру. Вы нарушаете хорошие принципы инкапсуляции? –