Вы должны использовать геттеры и сеттеры, потому что они позволяют вам контролировать интерфейс ваших объектов.
Например, допустим, у меня есть класс банковского счета в приложении Java:
class BankAccount {
private int balance;
BankAccount() {
balance = 0;
}
public void deposit(int amount) {
balance = balance + amount;
}
public void withdraw(int amount) {
balance = balance - amount;
}
}
Когда моему программному обеспечению требуется изменить баланс банковского счета посредством пополнения и снятия средств, оно вызывает соответствующие методы.
Теперь приходит какой-то хитрый человек, которому удается выяснить, что они могут увеличить свой банковский баланс, сказав программному обеспечению интернет-банкинга снять отрицательные суммы денег. Я могу исправить эту ошибку, добавив предварительное условие к методу вывода, и ошибка исчезнет.
Если бы поле баланса было общедоступным, а целая группа классов просто манипулировала его значением произвольно, теперь эти классы нужно было бы изменить. Если некоторые из этих внешних классов были написаны сторонними разработчиками, то мы очень стараемся исправить ошибку.
Зачем вам использовать открытые поля? В общем случае, вы, вероятно, не должны. Некоторые языки позволяют вам сделать область видимости общедоступной, тогда, если вам понадобится добавить метод получения / установки позже, вы можете сделать это без изменения интерфейса вашего объекта (я считаю, что C # делает это, но исправьте меня, если я ошибаюсь).